正文

虚基类
   在说明其作用前先看一段代码

class A
{
public:
    int iValue;
};

class B:public A
{
public:
    void bPrintf(){cout<<"This is class B"<<endl;};
};

class C:public A
{
public:
    void cPrintf(){cout<<"This is class C"<<endl;};
};

class D:public B,public C
{
public:
    void dPrintf(){cout<<"This is class D"<<endl;};
};

void main()
{
     D d;
     cout<<d.iValue<<endl; //错误,不明确的访问
     cout<<d.A::iValue<<endl; //正确
     cout<<d.B::iValue<<endl; //正确
     cout<<d.C::iValue<<endl; //正确
}

从代码中可以看出类B C都继承了类A的iValue成员,因此类B C都有一个成员变量iValue ,而类D又继承了B C,这样类D就有一个重名的成员 iValue(一个是从类B中继承过来的,一个是从类C中继承过来的).在主函数中调用d.iValue 因为类D有一个重名的成员iValue编译器不知道调用 从谁继承过来的iValue所以就产生的二义性的问题.正确的做法应该是加上作用域限定符 d.B::iValue 表示调用从B类继承过来的iValue。不过 类D的实例中就有多个iValue的实例,就会占用内存空间。所以C++中就引用了虚基类的概念,来解决这个问题。

class A
{
public:
    int iValue;
};

class B:virtual public A
{
public:
    void bPrintf(){cout<<"This is class B"<<endl;};
};

class C:virtual public A
{
public:
    void cPrintf(){cout<<"This is class C"<<endl;};
};

class D:public B,public C
{
public:
    void dPrintf(){cout<<"This is class D"<<endl;};
};

void main()
{
     D d;
     cout<<d.iValue<<endl; //正确
}

在继承的类的前面加上virtual关键字表示被继承的类是一个虚基类,它的被继承成员在派生类中只保留一个实例。例如iValue这个成员,从类 D这个角度上来看,它是从类B与类C继承过来的,而类B C又是从类A继承过来的,但它们只保留一个副本。因此在主函数中调用d.iValue时就不 会产生错误。

虚函数,虚基类 与纯虚函数 一相关推荐

  1. C++中为什么要引入抽象基类和纯虚函数?

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...

  2. C++抽象基类和纯虚成员函数

    公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象.在C++中,可以通过抽象基类来实现公共接口. 纯虚函数 纯虚成员函数的声明语法如下: virt ...

  3. C++之抽象基类与纯虚函数

    // Vitual_Base.cpp : Defines the entry point for the console application. //抽象基类与纯虚函数#include " ...

  4. C++引入抽象基类和纯虚函数的作用和目的

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...

  5. C++之继承探究(十):抽象基类与纯虚函数

    前文:C++之继承探究(九):多态的代价 抽象基类与纯虚函数   ♠\spadesuit♠ 纯虚函数:虚函数只有声明,函数体=0,就是一个纯虚函数,纯虚函数没有函数体,不需要实现.在子类里实现纯虚函数 ...

  6. C++ day24 继承(四)抽象基类,纯虚函数,protected

    文章目录 关键字protected(带来方便同时带来危险,最好不用) 抽象基类和纯虚函数(is-a关系用公有继承实现有时候也不太合适) 用圆和椭圆的笨拙派生为例,挑拨is-a和公有继承的搭档关系 替代 ...

  7. 虚函数,虚基类 与纯虚函数 二

    虚函数    还是先看代码 class A { public:     void funPrint(){cout<<"funPrint of class A"<& ...

  8. c++ 纯虚成员函数+抽象基类

    公共接口是指一系列成员函数的集合,支持该接口的类必须以合适的方式重新定义这些成员函数,否则就无法创建对象.C++ 中可以通过抽象基类来实现公共接口,为了介绍抽象基类,我们需要先来了解一下纯虚成员函数. ...

  9. [C++] - 纯虚函数 抽象基类 接口类

    翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...

最新文章

  1. oracle+cast函数+长度,oracle cast() 函数问题
  2. 零基础Python培训入门 教你认识下这些基础内容
  3. 【登录异常解决】Ubuntu 输入正确的密码后重新返回到登陆界面
  4. Java对象之间相同属性的赋值
  5. D盘提示RAW文件如何找回
  6. CSS多行文本垂直居中
  7. 【转载】2010年最全最新令人无语语录
  8. 面试官:换人!他连进程线程协程这几个特点都说不出
  9. 媒体查询-响应式布局-BFC
  10. PHP技巧:PATH_SEPARATOR是什么(Zend Framework引导文件中的路径用法)
  11. Azure PowerShell (10) 使用PowerShell导出订阅下所有的Azure VM和Cloud Service的高可用情况...
  12. html 按键hover,按钮hover效果
  13. PPT动画教程:修改幻灯片母板
  14. 2021年10月国产数据库大事记-墨天轮
  15. python绘图黄金螺旋_教案-for循环应用之“黄金螺旋-信息技术高中
  16. 每一天的邂逅......
  17. 超详细“CIDR地址块及其子网划分”
  18. Excel保护加密、解密、忘记密码该怎么办?
  19. 5G毫米波有源阵列封装天线技术研究
  20. 水流法敷设光缆技术的研究与应用

热门文章

  1. Android平台_驱动_SD_软件 概要设计说明书
  2. 用ABC三个字母简洁归纳2018年物联网趋势
  3. java list 内存分页_Java List内存分页
  4. 华为谈“不造车” ,每辆车上赚1万元。王兴:特斯拉终于遇到真正的对手!...
  5. Oracle中listener does not currently know of SID given in connect descriptor
  6. 微软请你学Linux,你没有听错,是Linux系列培训4月~6月,共16期,4月5日起盛情开始!微软请你!!!
  7. Asp学习者完整攻略之三:操作SQL:SQL基础:
  8. python使用scrapy_Python实现从脚本里运行scrapy的方法
  9. 喜马拉雅三年亏损超20亿 腾讯、小米为股东
  10. 真不一样了!苹果iPhone 14外形提前曝光:采用“打孔+药丸”的设计