Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针向量,继承 我是一个C++初学者,遇到了一个问题,我不知道如何修复< /P>_C++_Inheritance_Pointers_Vector - Fatal编程技术网

指针向量,继承 我是一个C++初学者,遇到了一个问题,我不知道如何修复< /P>

指针向量,继承 我是一个C++初学者,遇到了一个问题,我不知道如何修复< /P>,c++,inheritance,pointers,vector,C++,Inheritance,Pointers,Vector,我有两个类,这是头文件: 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_b

我有两个类,这是头文件:

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 
vec;
A)1(1);
B两(2,“hi”);
向量推回(&objectOne);
向量推回(&objectTwo);
我不能//这很好
cout-str//这里出错
我真的很困惑,我检查了网站和东西,但我只是不知道如何修复它,请帮助


提前感谢

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


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

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


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

这不起作用的原因是因为向量中的对象是(静态)类型
A
。在这种情况下,静态意味着编译时。编译器无法知道从
vec
中产生的任何内容将属于
A
的任何特定子类。这不是一件合法的事情,所以没有办法让它正常工作。您可以拥有
B
的集合,并访问
str
成员,也可以拥有
a
的集合而不访问


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

原因是因为vector中的对象是(静态)类型<代码> A<代码>。在这种情况下,静态意味着编译时。编译器无法知道从
vec
中产生的任何内容将属于
A
的任何特定子类。这不是一件合法的事情,所以没有办法让它正常工作。您可以拥有
B
的集合,并访问
str
成员,也可以拥有
a
的集合而不访问

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