虚拟成员(结构)之类的东西

时间:2013-01-22 14:12:23

标签: c++ oop inheritance

我有A级基本成员和职能:

class A{
public:
    typedef struct{
        int aa;
        int bb;
    } stEntry;
    stEntry entry;

    void function1();
    void function2();
};

比B类更应该扩展A类,包括结构stEntry ...

class B : public A{
public:
    typedef struct :stEntry
    {
        int cc;
    } stEntry;
    stEntry entry;

    void function3();
};

然后:

int main() {
    A a;
    B b;
    a.entry.aa = 1;    
    b.entry.aa = 2;
    b.entry.cc = 3;

    cout << "class A:"<<sizeof(a)<< endl;
    cout << "class B:"<<sizeof(b)<< endl;

    return 0;
}

我得到了

class A:8
class B:20

所以B类包含2个实例 - 8个字节(A类成员)+ 12个字节(B类成员)。

有没有办法扩展B类的结构stEntry? (没有2个实例)

2 个答案:

答案 0 :(得分:4)

不,因为您自己创建了两个实例。基类有一个实例,派生类有一个实例(扩展基类'内部类的类)。

你不能在它之外修改基类的结构 - 一旦你定义它,就会保持这样。

答案 1 :(得分:2)

具有虚拟继承的排序:

struct stEntryBase {
    int aa;
    int bb;
};

struct A : virtual stEntryBase {
    typedef stEntryBase stEntry;

    void function1();
    void function2();
};

struct stEntryDerived : virtual stEntryBase {
    int cc;
};

struct B : A, stEntryDerived {
    typedef stEntryDerived stEntry;

    void function3();
};

如果你想进入另一个级别的继承,那么B几乎是从stEntryDerived派生的。

现在您必须将字段称为a.aab.cc,而不是成员entry。此外,stEntry类型不再是POD(因此bbcc可能不再在内存中相邻。最后,由于虚拟继承而导致的大小增加实际上可能大于两个int s。

您可以做的是从stEntryDerived*的实例中获取stEntryDerived&B。然后,该指针/引用可以用作aa成员访问bbccstEntryDerived,而无需用户了解B 。所以你已经实现了界面分离,但需要付出一定的代价。