2017-05-07 50 views
0
#include<iostream> 
#include<map> 
using namespace std; 

class A{ 
public: 
    long a; 
}; 

class B : public A { 
public: 
    long b; 
}; 

void seta(A* data, int idx) { 
    data[idx].a = 2; 
} 

int main(int argc, char* argv[]){ 
    B data[4]; 
    for (int i = 0; i<4; ++i){ 
     data[i].a = 1; 
     data[i].b = 1; 
     seta(data, i); 
    } 
    for (int i = 0; i<4; ++i){ 
     std::cout << data[i].a << data[i].b; 
    } 
    return 0; 
} 

結果打印爲22221111C++關於類繼承的隱式轉換

當我將A::a類型更改爲雙倍時,結果打印爲20201111

當我將A::a類型更改爲float時,結果打印爲2107374182421073741821111

它如何融合?

+4

在這方面,數組不是多態。你只是有一堆未定義的行爲正在進行。 – StoryTeller

回答

0

指針算術不適用於運行時多態性。當您編寫data[idx]時,則*data必須具有與其靜態類型相同的動態類型。換句話說,data必須指向A類型的對象,而不是從A派生的某種類型。

由於上述不適用於您的程序,因此行爲未定義。

+0

感謝您的回答。我想知道什麼時候A:類型很長,爲什麼數據[idx] .a可以正確分配B:b value.to 2? – fazzy

+0

@fazzy,因爲這是未定義行爲的可能結果。 – user2079303

+0

這是一個面試問題,很多人跑很多次,結果是一樣的。有人說seta函數中的數據[idx] .a可以賦值給B:b,因爲隱式轉換.I非常好奇! – fazzy

0

您最好將您的屬性初始化爲0或-1,這樣您就可以確定它是否正在更改。

long b=0; 

你所得到的隨機值不轉換問題的價值,它是不確定的行爲仍在進行中,說書人評論。

最後,你的數據沒有指向類型A的對象,這是所有混亂背後的原因。