指针的矢量,继承

时间:2010-04-04 03:12:39

标签: c++ inheritance pointers vector

您好我是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 个答案:

答案 0 :(得分:1)

这不起作用的原因是因为向量中的对象是(静态)类型A。在这种情况下,静态意味着编译时。编译器无法知道vec中出现的任何内容都属于A的任何特定子类。这不是一件合法的事情,所以没有办法让它按原样运作。您可以拥有B的集合,并访问str成员或A的集合,而不是。{/ p>

这与Python之类的语言形成对比,其中成员将在运行时在对象的字典中查找。 C ++是静态类型的,因此在编译代码时,所有类型检查都必须解决。

答案 1 :(得分:0)

首先,发布完整的错误消息。

其次,如果你有一个A*,编译器就无法推断某个子类(在本例中是B)有一个名为str的字段,因此你会得到编译器错误。