C++ 类的继承五(多继承的二义性--虚基类)

//多继承的二义性--虚基类(了解为主)
#include<iostream>
using namespace std;

/*
多继承在现在的项目开发中一般不使用,他会增加项目的复杂度
*/

class Point{
public:
    Point(){
        x = 1;
        y = 1;
    }
    int x;
    int y;
};

class PointA :virtual public Point{
public:
    PointA(){
        a = 2;
    }
    int a;
};

class PointB :virtual public Point{
public:
    PointB(){
        b = 3;
    }
    int b;
};

class PointC :public PointA, public PointB{

};

void ProtectA(){
    PointC pc1;
    //pc1.x = 1;   报错  error C2385 : 对“x”的访问不明确
    //这时候我们可以使用 virtual关键字修饰继承关系
    pc1.y = 2;
    //virtual关键字可以检测出PointA和PointB都是从Point继承,所以pc1.y = 2;是给Point类对象赋值
}

void main(){
    ProtectA();
    system("pause");
}
时间: 2024-12-21 23:23:14

C++ 类的继承五(多继承的二义性--虚基类)的相关文章

钻石(菱形)继承和虚基类

钻石(菱形)继承 如图,B,C继承了A,D继承了B,C 在这种情况下,如果D类的对象通过B.C两个不同的作用域调用A的数据成员,将会产生两个 不同的A的数据成员值 如下(Grandfather对应A,a是其公有数据成员,Father1,Father2对应B.C,son对应D的对象,) 可以看到有两个不一样的a存在,说明在赋值过程中Father1,Father2分别调用Grandfather产生两个a 从其运行结果也可以看出来 如果son对象仅想产生一个数据成员a,则必须对Grandfather进

C++虚继承和虚基类

看如下代码: 1 #include <iostream> 2 3 using namespace std; 4 5 class A { 6 public: 7 A() {}; 8 9 protected: 10 int m_a; 11 }; 12 13 class B : public A 14 { 15 public: 16 B(){}; 17 18 protected: 19 int m_b; 20 }; 21 22 class C : public A 23 { 24 public: 2

C++的虚基类知识点

当在多条继承路径上有一个公共的基类,在这些路径的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类. class x1:virtual public x{//... ...};class x2:virtual public x{//... ...};虚基类的初始化 虚基类(虚拟继承)的初始化与一般多继承的初始化在语法上是一样的,但构造函数的调用次序不同. 派生类的构造函数的调用次序有三个原则:(1)虚基类的构造函数在非虚基类之

C++虚基类详解

1.虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如    c1.A::display( ).在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的.C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员.现在,将类A声明为

C++:虚基类

4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在派生类对象后增加直接基类名,使其惟一地标识一个成员,以免产生二义性. //例 4.15 虚基类的引例 #include<iostream> using namespace std; class Base{ //声明类Base1和类Base2的共同的基类Base public: Base() { a

一目了然c++虚基类!

1 #include <IOSTREAM.H> 2 //基类 3 class CBase 4 ...{ 5 protected: 6 int a; 7 public: 8 CBase(int na) 9 ...{ 10 a=na; 11 cout<<"CBase constructor! "; 12 } 13 14 ~CBase()...{cout<<"CBase deconstructor! ";} 15 }; 16 17 //

转 理解虚基类、虚函数与纯虚函数的概念

原文地址:理解虚基类.虚函数与纯虚函数的概念 引言 一直以来都没有写过一篇关于概念性的文章,因为我觉得这些概念性的东西书本上都有并且说的也很详细写来也无用,今天突发奇想想写 一写,下面就和大家讨论一下虚基类.虚函数与纯虚函数,一看名字就让人很容易觉得混乱.不过不要紧待看完本文后你就会理解了. 正文 虚基类        在说明其作用前先看一段代码 class A { public:     int iValue; }; class B:public A { public:     void bP

C++学习20 虚基类详解

多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如非常经典的菱形继承层次.如下图所示: 类A派生出类B和类C,类D继承自类B和类C,这个时候类A中的成员变量和成员函数继承到类D中变成了两份,一份来自 A-->B-->D 这一路,另一份来自 A-->C-->D 这一条路. 在一个派生类中保留间接基类的多份同名成员,虽然可以在不同的成员变量中分别存放不同的数据,但大多数情况下这是多余的:因为保留多份成员变量不仅占用

理解虚基类、虚函数与纯虚函数的概念

总结 虚基类     1, 一个类可以在一个类族中既被用作虚基类,也被用作非虚基类.     2, 在派生类的对象中,同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的子对象.     3, 虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的.     4, 最派生类是指在继承结构中建立对象时所指定的类.     5, 派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用:如果未列出,则表示使用该虚基类的缺省构造函数.     6, 从虚基类直接或间接派