类的虚继承

简介:

两个类继承于同一个基类,并共享基类的数据,即内存。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>  
using  namespace  std;  
   
//---------------------------------------------------------------------------  
class  Atest  
{    //基类  
     public :  
     int  i;  
};  
   
class  Btest : virtual  public  Atest //继承时使用了virtual关键字  
{     //继承类  
      public :  
      void  set( int  value)  
      {  
          i = value;  
      }  
      void  show()  
      {  
          cout << i <<endl;  
      }  
};  
   
class  Ctest : virtual  public  Atest  
{    //继承类  
     public :  
     void  set( int  value)  
     {  
          i = value;  
     }  
     void  show()  
     {  
          cout << i << endl;  
     }  
};  
   
class  Dtest:  public  Btest, public  Ctest  
{  
    //同时继承了两个中间类  
};  
   
int  main( int  argc,  char * argv[])  
{  
      Dtest d;  
      d.i = 20;  
      d.Btest::set(1290); //改写数据i  
      d.Ctest::show();    //读出数据i  
   
      system ( "pause" );  
        
      return  0;  
}  
//---------------------------------------------------------------------------

这个一个棱形类的继承结构,如果去掉virtual关键字,会出现二义性,编译出错。采用虚基类后,中间任何一个子类改写基类数据i,另一个类型都能读出同样的数据。
wKiom1nJtAjTT6DdAAEU5GEhBcU580.png














本文转自Chinayu201451CTO博客,原文链接:http://blog.51cto.com/9233403/1968681 ,如需转载请自行联系原作者




相关文章
|
6月前
|
数据安全/隐私保护
继承——基类与派生类
继承——基类与派生类
|
6月前
|
编译器
继承——虚函数
继承——虚函数
|
安全 程序员 编译器
C++中的继承/虚继承原理
C++中的继承/虚继承原理
115 0
|
编译器 C++
C++中虚继承时的构造函数
在虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。 下面我们以菱形继承为例来演示构造函数的调用: #include <iostream> using namespace std; //虚基类A class A{ public: A(int a); protected: int m_a; }; A:
103 1
|
C++
【C++】虚继承
虚继承解释和例题
76 0
<c++> 类的继承 | 基类与派生类 | 构造函数与析构函数
<c++> 类的继承 | 基类与派生类 | 构造函数与析构函数
145 0
基类与派生类对象的关系 派生类的构造函数
🐰 基类与派生类对象的关系 🐰派生类的构造函数
|
Java 编译器 C++
【C++要笑着学】继承 | 子类默认成员函数 | 单继承与多继承 | 钻石继承 | 虚拟继承 | 继承和组合(二)
本系列 C++ 教学博客的基础知识已经告一段落了,下面的章节我会先把面向对象三大特性讲完,然后穿插一些数据结构的教学以方便我们继续讲解 STL 的 map 和 set。对于面向对象三大特性 —— 封装、继承、多态,我们已经在之前讲解过封装了,本章将开始讲解继承,详细探讨多继承引发的钻石继承问题,并用虚继承解决钻石继承问题。阅读本章需要掌握访问限定符以及默认成员函数的知识,如果阅读过程中感到有些许生疏建议先去复习一下。
170 0
【C++要笑着学】继承 | 子类默认成员函数 | 单继承与多继承 | 钻石继承 | 虚拟继承 | 继承和组合(二)
|
安全 程序员 C++
【C++要笑着学】继承 | 子类默认成员函数 | 单继承与多继承 | 钻石继承 | 虚拟继承 | 继承和组合(一)
本系列 C++ 教学博客的基础知识已经告一段落了,下面的章节我会先把面向对象三大特性讲完,然后穿插一些数据结构的教学以方便我们继续讲解 STL 的 map 和 set。对于面向对象三大特性 —— 封装、继承、多态,我们已经在之前讲解过封装了,本章将开始讲解继承,详细探讨多继承引发的钻石继承问题,并用虚继承解决钻石继承问题。阅读本章需要掌握访问限定符以及默认成员函数的知识,如果阅读过程中感到有些许生疏建议先去复习一下。
119 0
【C++要笑着学】继承 | 子类默认成员函数 | 单继承与多继承 | 钻石继承 | 虚拟继承 | 继承和组合(一)
解决菱形继承的方法--虚继承
解决菱形继承的方法--虚继承
117 0
解决菱形继承的方法--虚继承