派生类需要多少空间?如果它本身和它的基类都有虚拟方法
How much space does a Derived class cost?If itself and its base class both have virtual methods?
我正在使用vs2013(Win32)测试以下程序:
#include <iostream>
class A {
virtual void funA();
};
class B {
virtual void funB();
};
class C :public A{
int i;
virtual void funC();
};
class D :public B, C{
virtual void funD();
};
int main(){
std::cout << "size A " << sizeof(A) << std::endl;
std::cout << "size B " << sizeof(B) << std::endl;
std::cout << "size C " << sizeof(C) << std::endl;
std::cout << "size D " << sizeof(D) << std::endl;
return 0;
}
结果是
尺寸A4
尺寸B 4
尺寸C8
尺寸D 12
为什么sizeof(C)!=8+sizeof(A)和sizeof(D)!=4+大小(B)+大小(C)?
A
是一个具有虚拟方法的单个基类,因此是一个vtable指针,因此在像您这样的32位平台上是4个字节。
CCD_ 2和CCD_ 3一样。
C
就像A
加上一个4字节的整数。请注意,它仍然只有一个基类(A
),这意味着仍然只有一条vtable指针。
D
继承自具有彼此不相关的虚拟方法的两个基类,因此D
获得两个vtable
指针(每个基类一个),加上来自C
的4字节整数。因此总共12个字节。
相关文章:
- C++:在派生类成员上调用基类方法
- 在基类方法中调用不同类的方法
- 无法访问派生类中的基类方法
- 有没有办法禁止派生类中的基类方法调用?
- 给定基类方法的编译时重写
- 在派生类中调用基类方法,而无需指定基类名称
- 如何将基类方法超载作为参数传递到C 中的模板类
- 如何模拟调用其基类方法的派生类
- 当应该调用派生类方法时,为什么要调用基类方法
- 从基类方法返回对派生类的引用
- 无法从派生的一个方法调用基类方法
- 用受保护的继承指向基类方法
- 使用来自基类方法的派生类数据成员
- 传递指针或引用派生类,以便调用基类方法
- C++11可变参数模板方法完全影子基类方法
- 更改基类方法在其派生类中的返回类型
- std::异步不能调用受保护的基类方法
- 是否有希望在std::变体上高效地调用一个公共基类方法
- 有没有一种不太直截了当的方法将基类方法引入子类?
- 重新定义派生类中的基类方法