您好我是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
我真的很困惑,我检查了网站和东西,但我只是不知道如何解决它,请帮助
提前致谢
答案 0 :(得分:1)
这不起作用的原因是因为向量中的对象是(静态)类型A
。在这种情况下,静态意味着编译时。编译器无法知道vec
中出现的任何内容都属于A
的任何特定子类。这不是一件合法的事情,所以没有办法让它按原样运作。您可以拥有B
的集合,并访问str
成员或A
的集合,而不是。{/ p>
这与Python之类的语言形成对比,其中成员将在运行时在对象的字典中查找。 C ++是静态类型的,因此在编译代码时,所有类型检查都必须解决。
答案 1 :(得分:0)
首先,发布完整的错误消息。
其次,如果你有一个A*
,编译器就无法推断某个子类(在本例中是B)有一个名为str
的字段,因此你会得到编译器错误。