我有一个工厂,该工厂创建均从基本结构派生的结构,并且这些结构均具有某些成员的默认值。当我将对象添加到基本类型的指针向量中时,似乎重置为基本成员数据。该对象仍然完好无损,我可以访问派生成员,但是从容器引用类型时,类型具有基值。
struct a {
unsigned int type = 0;
};
struct b : a {
unsigned int type = 1;
};
std::vector<a *> container;
b * message = new b;
container.push_back(message);
消息->类型为1
容器[0]->类型为0
当我推入向量无济于事时,我尝试以不同的方式进行投射
答案 0 :(得分:0)
此代码的实际作用:
struct a {
unsigned int type = 0;
};
struct b : a {
unsigned int type = 1;
};
它是否使b
有两个成员 type
,即a::type
和b::type
,一个成员隐藏另一个成员。成员变量不能被覆盖,也不能像成员函数一样virtual
。当您通过指向message
的指针访问b
(类型为a
)时,编译器只能看到a::type
,从而得到观察到的结果。有关覆盖成员变量的更多讨论,请参见here。如果您的设计仅限于单个type
成员,则可以进行以下简单更改:
struct a {
a(unsigned int _type = 0) : type(_type) {} // default constructor initializes type to 0
unsigned int type;
};
struct b : a {
b() : a(1) {} // default constructor initializes inherited type to 1
// no ambiguous 'type' member here
};
但是,如果您需要根据任意子类型执行复杂的逻辑,则最好开始学习virtual
member functions