写在前面的话,这篇文章探究的内容只是单纯的从内存的角度来理解一个语法。并不表示如果他们内存结构一样就可以随意使用。事实上,不同的逻辑结构所带来的扩展性、健壮性、便利性是有很大区别的。同时,也请严格按照现实对象的意义来进行编程。
探索的时候应该追求灵活自由,完成任务的时候请按套路出牌。^^
之前我们说,继承时可以认为子类中拥有一个完整的父类对象,而组合也同样如此,他们除了在使用语法和访问权限限制上有一些区别外,在内存结构上是否有其他区别?
代码如下:
classA
{
public:
A():a(1) {}
inta;
voidfunc()
{
printf("AAAA\n");
}
};
classB : public A
{
public:
B():b(2){}
intb;
voidfuncb()
{
printf("BBBB\n");
}
};
classC
{
public:
C():c(3){}
Aa;
intc;
voidfunC()
{
printf("CCCC\n");
}
};
继承B 的内存结构:
组合C的内存结构:
可以看出他们内存结构是一样的,但是也有一点区别,在继承中,父类内容在前,按顺序存放(虚继承除外)。
而在组合中,内存中存放的顺序和定义的顺序一致。