使用子类的ctor初始化

时间:2011-07-06 23:15:17

标签: c++ oop

struct A {
    B b;
    A(int x):b(x){}
    A(int x, float g) // how to implement this? I want to init b as a C. 
};
struct B {
    enum {e_c, e_d} type;
    int i;
    B(int i_):i(i_){}
};
struct C : public B {
    float f;
    C(int i_, float f_):B(i),f(f_){}
};
struct D : public B {
    double ff;
    D(int i_, double d):B(i),ff(d){}
};

也许还有另一种方法可以对此进行编码?最初我只有B级,但我决定将它拆分,所以我没有继续向B添加(不兼容/互斥)字段。我的解决方案是,当A使用b时,检查b的枚举以查看它的类型,然后将B *转换为C *或D *以获得浮动或双倍。我的问题是现在我不知道如何让A初始化b。这种语言甚至让我做那样的事情吗?

编辑:我刚刚意识到A的b可能没有分配空间来容纳C或D的额外字段。没有任何可用空间来存储浮动或双倍。所以我想正确的做法是将union {float f; double ff;};添加到B中?

2 个答案:

答案 0 :(得分:2)

你的例子有点困惑。但也许你想要一个指针?

struct A {
    B *b;
    A(int x):b(new B(x)) {}
    A(int x, float g):b(new C(x,g)) {}
   ~A() { delete b; }  // Very important!
};

请注意,如果您这样做,B 必须拥有虚拟析构函数。您还需要考虑复制A对象的含义。

答案 1 :(得分:1)

您的编辑是正确的。

执行所需操作的正常方法可能是存储B(最好是智能)指针,并在相应的构造函数中分配正确的类型。