【问题标题】:Vectors of Pointers, inheritance指针向量,继承
【发布时间】:2010-04-04 03:12:38
【问题描述】:

您好,我是 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 

我真的很困惑,我检查了网站和东西,但我不知道如何解决它,请帮助

提前致谢

【问题讨论】:

    标签: c++ inheritance pointers vector


    【解决方案1】:

    这不起作用的原因是你的向量中的对象是(静态)类型A。在这种情况下,静态意味着编译时。编译器无法知道来自vec 的任何东西都属于A 的任何特定子类。这不是合法的事情,所以没有办法让它按原样工作。您可以拥有B 的集合,并访问str 成员,或者A 的集合而不是。

    这与 Python 等语言不同,后者在运行时将在对象的字典中查找成员。 C++ 是静态类型的,所以所有类型检查都必须在编译代码时完成。

    【讨论】:

      【解决方案2】:

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

      其次,如果你有一个A*,编译器不能推断出某个子类(在这种情况下是 B)有一个名为str 的字段,因此你会得到一个编译器错误。

      【讨论】:

        猜你喜欢
        • 2017-12-28
        • 2016-09-02
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        相关资源
        最近更新 更多