Векторы указателей, наследство - PullRequest
1 голос
/ 04 апреля 2010

Привет, я новичок в 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 

Я действительно запутался, я проверял сайты и прочее, но я просто не знаю, как это исправить, помогите

заранее спасибо

Ответы [ 2 ]

1 голос
/ 04 апреля 2010

Причина, по которой это не сработает, заключается в том, что объекты в вашем векторе имеют (статический) тип A. В этом контексте статический означает время компиляции. Компилятор не может знать, что что-либо из vec будет принадлежать какому-то конкретному подклассу A. Это не разрешено законом, поэтому нет способа заставить все работать как есть. Вы можете иметь коллекцию B и получить доступ к члену str или коллекцию A, но не.

Это отличается от языка, такого как Python, где элемент будет просматриваться в словаре объекта во время выполнения. C ++ имеет статическую типизацию, поэтому все проверки типов должны выполняться при компиляции кода.

0 голосов
/ 04 апреля 2010

Сначала опубликуйте полное сообщение об ошибке.

Во-вторых, если у вас есть A*, компилятор не может сделать вывод, что некоторый подкласс (в данном случае B) имеет поле с именем str, и, следовательно, вы получите ошибку компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...