繁体   English   中英

如何用虚函数确定sizeof类?

[英]how to determine sizeof class with virtual functions?

这是一个功课问题。 对于以下代码,

#include <iostream>
using namespace std;

class A
{
public:
    virtual void f(){}
};

class B
{
public:
    virtual void f2(){}
};

class C: public A, public B
{
public: 
    virtual void f3(){}
};

class D: public C
{
public:
    virtual void f4(){}
};

int main()
{
    cout<<sizeof(D)<<endl;
}

输出为:8

任何人都可以解释它是如何8字节? 如果vtable实现依赖于编译器,那么在采访中我应该回答这类问题? 虚拟基类怎么样?

编辑:我正在使用32位平台。

这当然取决于实现。 它会成为一个糟糕的面试问题。 一个优秀的C ++程序员可以信任sizeof是正确的,让编译器担心那些可用的东西。

但是这里发生的是一个典型的基于vtable的实现需要在C类或D类对象中使用两个vtable。 每个基类都需要自己的vtable。 CD添加的新虚拟方法可以通过从一个基类扩展vtable格式来处理,但是AB使用的vtable不能组合。

在伪C代码中,这里是类型D的最派生对象在我的实现中的表现(g ++ 4.4.5 Linux x86):

void* D_vtable_part1[] = { (void*) 0, &D_typeinfo, &A::f1, &C::f3, &D::f4 };
void* D_vtable_part2[] = { (void*) -4, &D_typeinfo, &B::f2 };

struct D {
  void** vtable_A;
  void** vtable_B;
};

D d = { D_vtable_part1 + 1, D_vtable_part2 + 1 };

在这个问题中,如果你尝试获得Sizeof类A,它会给你回答'4'因为A只有一个虚函数所以它的__vptr将是'4'字节。

同样,如果你试图得到Sizeof B类,它会给你回答'4'因为B也只有一个虚函数所以它的__vptr将是'4'字节。

但是C类继承A和B类,C本身具有虚函数。 因此C将接收2个__vptr指针,并且对于它自己的虚函数C将使用继承的__vptr。 因此,如果您尝试获取Sizeof类C,它将给出答案'8',因为C有两个虚拟指针。

最后,类D继承了类C,因此D将使用继承的__vptr作为其自己的虚函数,因为类C的大小为'8'字节,因此sizeof D将给出答案'8'字节。

原谅我含糊不清,但你提到它本质上是家庭作业。

查看sizeof()为其他类返回的内容。 您的答案将根据您的编译器以及您是在32位还是64位环境而有所不同。

快乐的天意!

对象的大小与它有多少方法无关 ,也与这些方法是否为虚方法无关。 对象的大小由其成员变量确定。

我不能确切地告诉你为什么你得到8字节的大小。 由于您的类中没有数据成员,因此C ++编译器原则上可以生成一个根本不占空间的类[1]! 我猜测8字节是提供指向vtbl的指针所需的最小值,加上可能还有一些填充。

[1]我想。 没有时间检查规格,以确定sizeof是否可以返回0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM