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

C++ 多级/多重继承期间对象的大小,c++,multiple-inheritance,C++,Multiple Inheritance,大小是否也包括虚拟表。这里也不能有虚拟表,因为没有定义虚拟函数。请帮忙澄清我的疑问 PS:到目前为止我所了解的是: 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 ( protecte

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

PS:到目前为止我所了解的是:

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).

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

例如,假设您已声明
int count

然后,您需要在“后缀”版本中返回
int
,在“前缀”版本中返回
int&
const int&

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

这两个版本之间的差异仅在于返回值。“prefix++”返回操作前的
count
值,“postfix++”返回操作后的
count

此外,由于其性质,“postfix++”只能返回递增变量的副本(例如,
int
),而“prefix++”也可以返回该变量的引用(例如,
int&


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

返回类型为
void
将不起作用。它应该返回对象。我不明白你是怎么做到的。如果您正在寻找示例代码,那么已经有关于示例代码的运算符重载的消息。您是否尝试过编译它?你怎么累了?在返回'void'[-fppermissive]的函数中说
error:return语句带有值。很抱歉重复评论,但这部分“我已经尝试过了”似乎是个大谎言-1 =(.非常抱歉…是的,复制并粘贴了错误的重载函数…请查看已编辑的部分…删除了return关键字…实际实现在类中有一个count变量。很抱歉浪费您的时间…应该提供正确的代码…但现在这是正确的…请解释运算符o的这两种方法的用法verloading@eyeanand
void
返回类型对于重载后缀运算符仍然不起作用!请现在查看编辑的部分…删除了return关键字…实际实现在类中有一个count变量。很抱歉浪费您的时间…应该提供正确的代码…但现在这是正确的…请解释使用这两种操作符重载的方法好吧,
++
操作符背后的整个想法是它们返回一个值。如果它们不返回任何东西,那么调用“prefix++”和“postfix++”显然会产生同样的影响。正如我在上面的回答中提到的,我仍然不知道在您调用
a++
,但没有实现“postfix++”。我还编辑了第二部分:(因此,您的问题中没有任何问题!您已经实现了'prefix++'和'postfix++',并且您正在使用
++a
a++
调用这两个函数。到底发生了什么事情,与您预期的不同呢???void运算符++(int){count++;}有什么用处当只有一个重载可以同时完成这两个任务时…为什么文献中给出了这样的类型
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().