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

something like virtual member(structure)

本文关键字:结构 虚拟成员 类似于      更新时间:2023-10-16

我有具有基本成员和函数的类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 个实例)

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

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

有点,虚拟继承:

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秒。

您可以做的是从B实例中获取stEntryDerived*stEntryDerived&。然后,该指针/引用可用于访问aabbcc作为stEntryDerived的成员,而用户不需要知道B。因此,您已经实现了接口分离,但要付出一定的代价。