专栏首页程序员C++之虚继承

C++之虚继承

如果一个类从多个类继承而来,而这些类有公共基类。那么在多该基类中定义的成员访问时会出现二义性。C++设计虚继承来解决这个问题。虚继承的本质就是子类引用父类的内存空间,而不创建自己的内存空间。这样既解决了多重继承可能引发的二义性问题,也使得内存得以释放。

在虚继承过程中的基类被叫做:虚基类

那么实际上,虚继承的本质就是使用一个指向虚基类的指针,这样就无论你怎么继承,就只有一份基类内存空间。

C++使用关键字virtual来进行虚继承。

语法:class B : virtual public A{};

#include<iostream>

using std::cout;
using std::endl;

class MyClass
{
public:
	int a;
	int b;
};

class C1 : virtual public MyClass
{
public:
};

class C2 : virtual public MyClass
{
public:
};

class Last : public C1, public C2			//多继承
{

};
int main()
{
	Last L;

	L.a;

	return 0;
}

通过虚继承,这样MyClass类的内存空间只有一份。就不会有二义性了。

还有一种情况是这样的。

这种情况下,虚继承也无法帮到我们。我们只能使用

c.A::a;
c.B::a;

来明确对类成员的调用,从而避免二义性的产生。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++之多继承

    C++支持多继承,其它的面向对象编程语言几乎都不支持多继承。而多继承一旦使用不当就会造成二义性。这可能就是其它语言都不支持多继承的原因。实际来看,几乎没有使用多...

    zy010101
  • QMainWindow和QAction

    QMainWindow是Qt 框架带来的一个预定义好的主窗口类。一个主窗口一般都是由下图所示部分组成。

    zy010101
  • C++之运算符重载(二)

    https://blog.csdn.net/zy010101/article/details/105240318

    zy010101
  • 设计模式第四讲--命令模式

    命令模式最初来源于图形化用户界面设计,但现在广泛应用于企业应用设计,特别促进了控制器(请求和分发处理)和领域模型(应用逻辑)的分离.说的更简单一点,命令模式有助...

    用户2825413
  • 装饰器模式(Decorator)

    装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

    小狐狸
  • Android水波动画帮助类,一行代码实现View显示/隐藏/startActivity特效(0.3.1)

    So,你可以如下compile该library了,也可以把这个类CircularAnim拷贝到项目里去。

    冰之角
  • 带你了解C#每个版本新特性

    上学时学习C#和.NET,当时网上的资源不像现在这样丰富,所以去电脑城买了张盗版的VS2005的光盘,安装时才发现是VS2003,当时有一种被坑的感觉,但也正是...

    oec2003
  • 我在工作中使用的自己实现的超简易ORM工具

    我在7月份到了家新公司,要维护一个在原来.net1.1上的系统。我进去一看代码就傻了眼了,满屏的SQL语句,看得脑袋嗡嗡的.但是苦于.net1.1,又不敢大动直...

    用户1687945
  • Java设计模式学习记录-中介者模式

    中介者模式听名字就能想到也是一种为了解决耦合度的设计模式,其实中介者模式在结构上与观察者、命令模式十分相像;而应用目的又与结构模式“门面模式”有些相似。但区别于...

    纪莫
  • java中ThreadLocalRandom的使用

    在java中我们通常会需要使用到java.util.Random来便利的生产随机数。但是Random是线程安全的,如果要在线程环境中的话就有可能产生性能瓶颈。

    程序那些事

扫码关注云+社区

领取腾讯云代金券