多级/多重继承期间的对象大小

时间:2014-02-03 16:09:59

标签: c++ multiple-inheritance

Below is a pseudo declaration for a multilevel inheritance.

Base class ( protected int data)

derived1 : virtual public base ( protected int data1 )

derived2 : virtual public base ( protected int data2)

derived3 : derived1,derived2 ( private int data3 )

Main(){ base b;    derived1 d1;   derived2 d2;   derived3 d3; }

sizeof(b) // 4 which is correct as only int (4bytes)
sizeof(d1) // 12 why not 8 -> 4(base) + 4(derived)
sizeof(d2) // ??? whatever applies above should apply here
sizeof(d3) // 24 why not 12 -> 4(base) + 4(derived1/derived2) + 4(d3).

大小是否也包括虚拟表。这里再次没有虚拟表,因为没有定义虚函数。请帮助澄清我的疑问。

PS:到目前为止我已经理解了:

Unless the function is declared virtual in base class,

base *bptr;
 derived d;
 bptr = &d;
 bptr->fun();  // will call the base class function.

But if the fun() is declared virtual then the above code will call derived class fun().

1 个答案:

答案 0 :(得分:1)

首先,在上面的实现中,您需要返回count而不是void的类型。

例如,假设您已声明int count

然后您需要在'后缀'中返回int。版本以及'前缀'中的int&const int&版本

尝试b = a++b = ++a,您会看到(当然,您需要每个函数返回一个值)。

这两个版本之间的区别仅在于返回值。 '前缀++'在操作之前返回count 的值,以及' postfix ++'在操作之后返回count 的值。

此外,由于其性质,后缀++' 只能返回正在递增的变量的副本(例如int),而'前缀++' 可以返回该变量的引用(例如int&)。

由于您未在实现中返回任何内容,因此无法使用这两个版本之间的差异。