博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++虚函数继承与虚继承
阅读量:6550 次
发布时间:2019-06-24

本文共 1207 字,大约阅读时间需要 4 分钟。

hot3.png

虚函数继承和虚继承是完全不同的两个概念。

虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联。

虚继承就是为了节约内存,他是多重继承中的特有的概念。适用于菱形继承形式。

比如B继承于A、C继承于A、D继承于B和C,显然D会继承两次A(图1)。因此,为了节省空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类(图2)。代码如下:

 A    A           A 

  \    /           / \ 
  B   C           B  C 
   \  /            \  / 
   D             D 
  (图1)          (图2)

class A; 

class B:vitual public A; 
class C:vitual public A; 
class D:public B,public C; 
虚继承的时候子类会有一个指向自己虚函数表的指针,同时也会加入一个指向父类的虚类指针,然后还要包含父类的所有内容。

虚继承时如果子类父类都有虚函数,那么它会重新建立一张虚表,不包含父类虚表的内容;而在普通的继承中却是在父类虚表的基础上建立一张虚表。这就意味着如果虚继承中子类父类都有各自的虚函数,在子类里面就会有两个虚函数表指针,一个指向父类的虚表,一个指向子类的虚表,而普通的继承只有一个指向子类虚表的指针。代码说明:

class A

{
    int k;
public:
    virtual void aa(){};
};

class B:public virtual A

{
    int j;
public:
    virtual void bb(){};
};

class C:public virtual B

{
    int i;
public:
    virtual void cc(){};
};

int main()

{
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    cout << sizeof(C) << endl;
    system("pause");
    return 0;
}
输出结果为:8、20、32。

怎么来的呢?类A中包含一个整型变量k(4字节),一个虚表指针(4字节),所以一共8字节。类B中,一个整型变量j(4字节),一个虚表指针(4字节),因为B虚继承于A,所有会有一个指向类A的虚类指针(4字节),同时还要包含类A中的整型变量k(4字节)以及类A的虚表指针(4字节),所以一共20字节。类C同理。

如果将上述代码改为普通继承,那么输出结果为:8、12、16。没有虚类指针,也不会有多个虚表指针

 

转载于:https://my.oschina.net/u/920274/blog/3017366

你可能感兴趣的文章
远程桌面无法使用,登录后立即自动注销
查看>>
oracle数据库安装组成
查看>>
Leetcode | Swap Nodes in Pairs
查看>>
常规诊疗条件下比较依那西普生物类似药(益赛普)与阿达木、英夫利西对RA的疗效[EULAR2015_SAT0360]...
查看>>
Oracle如何导入导出数据(转自)
查看>>
第十一天笔记
查看>>
安装SQl 2008为SQL Server代理服务提供的凭据无效
查看>>
Hadoop综合大作业
查看>>
python PIL 图像处理操作
查看>>
小程序分享好友和群聊
查看>>
从range和xrange的性能对比到yield关键字(中)
查看>>
007-因果图判定表
查看>>
如何用Fiddler对Android应用进行抓包
查看>>
appium架构分析
查看>>
Python实战之Selenium自动化测试web登录
查看>>
IOS开发之----常用函数和常数
查看>>
测试架构师修炼之道:“秘书九段”的故事 - 延伸至测试六段
查看>>
Jenkins 安装配置-问题记录
查看>>
步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)
查看>>
sql service添加索引
查看>>