2010-04-04 4 views
1

Привет Я новичок C++ просто столкнулся с проблемой, я не знаю, как исправитьвекторов указателей, наследование

У меня есть два класса, это заголовочный файл:

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

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

я хотите создать вектор в основной котором хранить либо класса а или класса 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 и, следовательно, вы получите ошибку компилятора.

Смежные вопросы