类似于虚拟成员(结构)的东西
something like virtual member(structure)
我有具有基本成员和函数的类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.aa
,b.cc
,没有成员entry
。此外,stEntry
类型不再是 POD(因此 bb
和 cc
在内存中可能不再相邻)。最后,由于虚拟继承而导致的大小增加实际上可能大于两int
秒。
您可以做的是从B
实例中获取stEntryDerived*
或stEntryDerived&
。然后,该指针/引用可用于访问aa
、bb
和cc
作为stEntryDerived
的成员,而用户不需要知道B
。因此,您已经实现了接口分离,但要付出一定的代价。
相关文章:
- 如何访问指针结构的成员变量?
- C++结构元素(成员变量)的数量
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 如何修改增强 hana 结构的成员
- 钻石继承虚拟成员铸造与指针
- 具有未知结构作为成员的类
- 使用其他成员初始化结构的成员?
- 如果我必须覆盖非虚拟成员函数怎么办
- 如何将结构数据成员传递到函数中
- c++\CLI dll包装器,用于调用c++类中的虚拟成员
- 对结构int成员进行排序
- C++11-在结构向量中修改结构的成员
- 如何获取结构体成员的地址
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 通过指针算法访问结构数据成员
- 是否可以将结构的成员变量作为参数传递
- 非虚拟成员函数是否可以使用模板参数?
- 访问数组中所有结构的成员
- 在C中使用具有虚拟成员(即非POD)的C++结构
- 类似于虚拟成员(结构)的东西