我有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个实例)
答案 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.aa
,b.cc
,而不是成员entry
。此外,stEntry
类型不再是POD(因此bb
和cc
可能不再在内存中相邻。最后,由于虚拟继承而导致的大小增加实际上可能大于两个int
s。
您可以做的是从stEntryDerived*
的实例中获取stEntryDerived&
或B
。然后,该指针/引用可以用作aa
成员访问bb
,cc
和stEntryDerived
,而无需用户了解B
。所以你已经实现了界面分离,但需要付出一定的代价。