基类类型向量中的派生结构

时间:2018-08-14 23:52:22

标签: c++ inheritance polymorphism

我有一个工厂,该工厂创建均从基本结构派生的结构,并且这些结构均具有某些成员的默认值。当我将对象添加到基本类型的指针向量中时,似乎重置为基本成员数据。该对象仍然完好无损,我可以访问派生成员,但是从容器引用类型时,类型具有基值。

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

当我推入向量无济于事时,我尝试以不同的方式进行投射

1 个答案:

答案 0 :(得分:0)

此代码的实际作用:

struct a {
    unsigned int type = 0;
};

struct b : a {
    unsigned int type = 1;
};

它是否使b有两个成员 type,即a::typeb::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