C++虚继承

首先看一段代码:

class B
{
public :
int b;
};
class D: virtual public B
{
public :
int d;
};

int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(D)<<endl;
};

    在vs输出12,当将virtual关键字去掉之后,输出8;可见虚拟继承需要额外的空间开销。在vs中,引入了所谓的“虚基类表”(类似虚函数表),同时每个Class Object中有一个指向虚基类表的指针,虚基类表中存放着对应虚基类对象的指针(地址)。

那么两个虚基类的情况如何呢?我们修改代码如下:

class B
{
public :
int b;
};

class B1
{
public :
int b1;
};

class D: virtual public B,virtual public B1
{
public :
int d;
};

结果输出为16,只是增加了新的基类的数据成员(int),并没有增加更多的额外空间,所以进一步说明“虚基类表”的存在,因为所有的虚基类指针都在虚基类表中。

 

时间: 2025-01-21 00:35:17

C++虚继承的相关文章

C++对象布局及多态探索之菱形结构虚继承

这次我们看看菱形结构的虚继承.虚继承的引入本就是为了解决复杂结构的继承体系问题.上一篇我们在讨论虚继承时用的是一个简单的继承结构,只是为了打个铺垫. 我们先看看这几个类,这是一个典型的菱形继承结构.C100和C101通过虚继承共享同一个父类C041.C110则从C100和C101多重继承而来. struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;};struct C100 : public vir

C++中的虚继承(virtual inheritance)

虚继承主要是避免基类重复被继承, 包含多个相同基类, 导致歧义性, 使用虚基类(virtual base class)继承, 可以使派生对象只包含一份基类文件. 如果不使用虚继承, 则派生类需要提供一份自己的示例版本, 参见: http://blog.csdn.net/caroline_wendy/article/details/18077235 代码: /* * cppprimer.cpp * * Created on: 2014.1.10 * Author: Spike */ /*eclip

C++中虚继承的构造(construct)和析构(destruct)顺序

虚继承(virtual inheritance)的构造(construct)和析构(destruct)顺序 在多重继承的时候, 构造顺序是 虚继承按顺序优先, 再次是其他按顺序, 由基类至派生类; 析构顺序正好相反; 代码如下: /* * cppprimer.cpp * * Created on: 2014.1.10 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <string>

C++:虚继承(virtual inheritance) 详解

在多重继承(multiple inheritance)中, 可能出现多个基类继承自同一个基类, 即"菱形继承", 会导致最顶层的基类, 被复制多次; 可以采用虚继承(virtual inheritance)的方式, 使派生类(derived class)只保留最顶层基类的一个副本. virtual, 即需要vptr(virtual table pointer), 即虚表指针, 额外占用4个字节; 代码如下: /* * test.cpp * * Created on: 2014.04.1

C++:类的虚函数及虚继承所占的空间

char占用一个字节, 但不满足4的倍数时, 会进行数据对齐, 使用4的倍数的字节(byte). GCC: GCC中, 无论是虚函数还是虚继承, 都需要将指针存储在虚函数表(virtual function table), 占用4个字节. 继承会继承基类的数据, 和虚函数表, 即继承基类的空间. 代码: /* * test.cpp * * Created on: 2014.04.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <

C++对象布局及多态实现探索之虚继承

下面我们来看虚继承.首先看看这C020类,它从C010虚继承:} struct C010{ C010() : c_(0x01) {} void foo() { c_ = 0x02; } char c_;};struct C020 : public virtual C010{ C020() : c_(0x02) {} char c_;}; 运行如下代码,查看对象的内存布局: PRINT_SIZE_DETAIL(C020) 结果为: The size of C020 is 6The detail o

virtual-C++ 求解在虚继承情况下类的大小

问题描述 C++ 求解在虚继承情况下类的大小 (1) #include using namespace std; class CommonBase { int co; //virtual void fun(){ } }; class Base1 : virtual public CommonBase { public: virtual void print1() { } virtual void print2() { } private: int b1; }; class Base2 : vir

C++ 多继承和虚继承的内存布局

来源:http://www.oschina.net/translate/cpp-virtual-inheritance 来源:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html C++中的虚拟继承的一些总结 1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,

c++基础语法:虚继承_MsSql

虚继承 的概念的提出主要是为了解决C++多继承的问题,举个最简单的例子: 复制代码 代码如下: class animal{        public :              void op()                  {cout << "hello animal" ;} };class tiger : public animal {        public :              void tg()                  {cout

消息印射-两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法

问题描述 两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法 一个类实现了可悬浮侧靠的对话框,另一个类实现了有滑动条的对话框,然后我就想到了多重继承来实现一个可悬靠带滑动条的对话框.由于看书上说要虚继承基类,并且在初始化成员类表中显示初始化基类,这些都有做,但是在消息印射部分出了问题. 这里编辑代码不方便,详细情况在帖子中 http://bbs.csdn.net/topics/390871222 不胜感激