2010-04-04 133 views
1

嗨,我只是遇到了一個問題,我不知道如何解決向量指針的,繼承

我有兩個類C++初學者,這是頭文件:

class A 
{ 
public: 
    int i; 
    A(int a); 
}; 

class B: public A 
{ 
public: 
    string str; 
    B(int a, string b); 
};  

然後我要創建一個主要載體,它存儲類A或B類

vector<A*> vec; 
A objectOne(1); 
B objectTwo(2, "hi"); 
vec.push_back(&objectOne); 
vec.push_back(&objectTwo); 
cout << vec.at(1)->i; //this is fine 
cout << vec.at(1)->str; //ERROR here 

我真的很困惑,我檢查站點和東西,但我只是不知道如何解決它,請幫助

在此先感謝

回答

1

這將不起作用的原因是因爲向量中的對象是(靜態)類型A。在這種情況下,靜態意味着編譯時。編譯器無法知道任何來自vec的內容都將是A的任何特定子類。這不是一個合法的事情,所以沒有辦法讓它按原樣工作。您可以收集B,並訪問str成員,或者收集A而不是。

這與諸如Python之類的語言形成對比,其中在運行時會在對象的字典中查找成員。 C++是靜態類型的,所以當編譯代碼時,所有的類型檢查都必須解決。

0

首先,發佈完整的錯誤消息。其次,如果你有一個A*,編譯器不能推斷出某個子類(本例中爲B)有一個名爲str的字段,因此你將得到一個編譯器錯誤。