C++中关于虚函数与继承的疑问?(主要是vtable和分配内存空间大小)

[复制链接]
查看11 | 回复2 | 2010-11-12 12:08:15 | 显示全部楼层 |阅读模式
C++中关于虚函数与继承的疑问?(主要是vtable)
class base
{
public:

virtual void Func1( void ) = 0;

virtual void Func2 ( void ) = 0;

virtual ~base()

{}
};
class classA : public base
{

public:

virtual ~classA()

{}
};
class classB : public base
{

public:

virtual ~classB()

{}
};
class classC : public classA, public classB
{
public:

virtual void Func1( void )

{

cout << "classC::Func1(void)" << endl;

}

virtual void Func2 ( void )
{

cout << "classC::Func2(void)" << endl;
}
virtual void Func3(void)
{
cout << "classC::Func3(void)" << endl;
}
virtual ~classC()
{}
};
int main ( void )
{
cout << "class base is size :" << sizeof(base) << endl;
cout << "classA is size :" << sizeof (classA) << endl;
cout << "classB is size:" << sizeof (classB) << endl;
cout << "classC is size:" << sizeof(classC) << endl;
}
输出结果是:
class base is size : 4
classA is size : 4
classB is size: 4
classC is size: 8
现在我就有一个疑问了,为什么classC is size :8 是8,而不是12
我觉得classC除了保存classA的虚函数表指针pvtable和classB的虚函数表指针pvtable之外,他自己不是也定义了自己的虚函数吗?那么为什么就不用维护自己的虚函数表了呢?
难道在这里,自己的虚函数virtual void Func3(void),直接被当成了普通函数?
我也写过测试
class classD
{
public:
virtual void FuncD(void)
{
cout << "classD::FuncD(void)" << endl;
}
virtual ~classD()
{}
};
int main(void)
{
cout << "classD size :" << sizeof(classD) << endl;
}
输出结果是:
classD size: 4
不知道有没有哪位大侠对这理解的比较深刻,希望可以指点迷津?
编译环境是:vc++6.0
谢谢了!
如果可以附上相关的类继承图解说就最好了!

回复

使用道具 举报

千问 | 2010-11-12 12:08:15 | 显示全部楼层
当子类继承父类的时候,自己创建一个虚基类表,这个表包含了父类的虚基类,也包含自己的虚基类,如果子类中有虚函数重载了父类的虚函数,那么直接在子类的虚基类表中修改继承父类表中所覆盖的函数。这里的析构函数就是这种情况,他继承了2个虚基类表,但是里面的两个析构函数是一样的。都被覆盖了。你看看下面这个文章,就会理解,http://apps.hi.baidu.com/share/detail/10335597你的这个问题属于一般继承(有虚函数覆盖)。这种情况 这边文章中就有图。
回复

使用道具 举报

千问 | 2010-11-12 12:08:15 | 显示全部楼层
参见 《深入探索c++对象模型》
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行