3

我有具有基本成员和功能的 A 类:

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

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

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

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 个实例)

4

2 回答 2

4

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

你不能在它之外修改基类的结构——一旦你定义了它,它就保持不变。

于 2013-01-22T14:15:02.970 回答
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.aa, b.cc,没有成员entry。此外,这些stEntry类型不再是 POD(因此bb并且cc可能不再在内存中相邻)。最后,由于虚拟继承而增加的大小实际上可能大于两个ints。

您可以做的stEntryDerived*stEntryDerived&B. 然后,该指针/引用可用于访问aabbcc作为 的成员stEntryDerived,而用户无需了解B。所以你已经以一定的代价实现了接口的分离。

于 2013-01-22T14:27:17.957 回答