簡體   English   中英

指針向量,繼承

[英]Vectors of Pointers, inheritance

嗨,我是C ++初學者,剛遇到一個我不知道如何解決的問題

我有兩個類,這是頭文件:

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

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

那么我想在main中創建一個向量來存儲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 

我真的很困惑,我檢查了網站和內容,但我只是不知道該如何解決,請幫忙

提前致謝

之所以不起作用,是因為向量中的對象屬於(靜態)類型A 在這種情況下,靜態意味着編譯時。 編譯器無法知道vec產生的任何內容都將是A的任何特定子類。 這不是合法的事情,因此沒有辦法使其按原樣工作。 您可以具有B的集合並訪問str成員,而不能訪問A的集合。

這與Python等語言相反,在Python中,會在運行時在對象的字典中查找成員。 C ++是靜態類型的,因此在編譯代碼時必須進行所有類型檢查。

首先,發布完整的錯誤消息。

其次,如果您有A* ,則編譯器無法推斷出某個子類(在本例中為B)具有名為str的字段,因此您將獲得編譯器錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM