gpt4 book ai didi

c++ - 为什么 virtual 关键字会增加派生类的大小?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:48 25 4
gpt4 key购买 nike

我有两个类 - 一个基类和一个派生类:

class base {

int i ;

public :
virtual ~ base () { }
};

class derived : virtual public base { int j ; };

main()

{ cout << sizeof ( derived ) ; }

这里的答案是 16。但是如果我改为非虚拟公共(public)继承或使基类成为非多态的,那么我得到的答案是 12,即如果我这样做:

class base {

int i ;

public :
virtual ~ base () { }
};

class derived : public base { int j ; };

main()

{ cout << sizeof ( derived ) ; }

class base {

int i ;

public :
~ base () { }
};

class derived : virtual public base { int j ; };

main()

{ cout << sizeof ( derived ) ; }

在这两种情况下,答案都是 12。

有人能解释一下为什么派生类的大小在第一种情况和其他两种情况下存在差异吗?

(我在 code::blocks 10.05 上工作,如果有人真的需要的话)

最佳答案

这里有两件事会导致额外的开销。

首先,在基类中有虚函数会增加其大小一个指针大小(在本例中为 4 个字节),因为它需要将指针存储到虚方法表中:

normal inheritance with virtual functions:

0 4 8 12
| base |
| vfptr | i | j |

其次,在虚拟继承中,derived 中需要额外的信息才能定位base。在正常继承中,derivedbase 之间的偏移量是一个编译时间常量(0 表示单继承)。在虚拟继承中,偏移量可以取决于对象的运行时类型和实际类型层次结构。实现可能会有所不同,但例如 Visual C++ 是这样做的:

virtual inheritance with virtual functions:

0 4 8 12 16
| base |
| xxx | j | vfptr | i |

其中 xxx 是指向某些类型信息记录的指针,它允许确定到 base 的偏移量。

当然也可以在没有虚函数的情况下实现虚继承:

virtual inheritance without virtual functions:

0 4 8 12
| base |
| xxx | j | i |

关于c++ - 为什么 virtual 关键字会增加派生类的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com