栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 虚继承

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 虚继承

参考   虚继承_饭_团的博客-CSDN博客_虚继承

虚继承:主要解决棱形继承时,出现的内存访问冲突问题。

声明格式:class 类名 :virtual 继承方式  类名

继承方式可以缺省,缺省之后默认继承方式为 private 私有继承。

注意,代码中class D的初始化列表顺序需要为A ->B -> C,也就是实际执行时,构造函数的调用顺序。

#include 
#include 
using namespace std;
class A {
public:
  A(int a) : ma(a) { cout << " A constructor. ma = " << ma << endl; }
  ~A() { cout << " A destructor. " << endl; }

public:
  int ma;
};
class B : virtual public A {
public:
  B(int b) : A(b), mb(b) {
    cout << " B constructor. mb = " << mb << " ma =" << ma << endl;
  }
  ~B() { cout << " B destructor. " << endl; }

public:
  int mb;
};
class C : virtual public A {
public:
  C(int c) : A(c), mc(c) {
    cout << " C constructor. mc = " << mc << " ma =" << ma << endl;
  }
  ~C() { cout << " C destructor. " << endl; }

public:
  int mc;
};

class D : public B, public C {
public:
  D(int d) : A(d + 3), B(d + 1), C(d + 2), md(d) {
    cout << " D constructor. " << endl;
  }
  ~D() { cout << " D destructor. " << endl; }

public:
  int md;
};
int main() {
  D d(10);
  cout << " " << d.ma << " " << d.mb << " " << d.mc << " " << d.md << endl;
  return 0;
}

使用虚继承时的 打印结果:

A constructor. ma = 13
 B constructor. mb = 11 ma =13
 C constructor. mc = 12 ma =13
 D constructor. 
 13 11 12 10
 D destructor. 
 C destructor. 
 B destructor. 
 A destructor.

注意,如果不使用虚继承,将virtual 去掉,编译执行也是没问题的,打印结果如下。可以看到 A 的构造函数被调用了两次,ma的值是不一样的。

A constructor. ma = 11
 B constructor. mb = 11 ma =11
 A constructor. ma = 12
 C constructor. mc = 12 ma =12
 D constructor. 
  11 12 10
 D destructor. 
 C destructor. 
 A destructor. 
 B destructor. 
 A destructor.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850353.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号