多继承
单继承:一个派生类只有一个基类,这就是单基类继承,简称“单继承”
多继承:一个派生类允许有两个及以上的基类,这就是多基类继承,简称“多继承”
单继承中,派生类是对基类的特例化,例如编程类书籍是书籍中的特例。而多继承中,派生类是所有基类的一种组合。
在多继承中,派生类继承了所有基类中的所有成员变量和成员函数,这些继承过来的成员变量及成员函数其访问规则与单继承是相同的
基类与基类之间,基类与派生类之间。为了解决命名冲突问题我们只能采用域解析操作符来区分具体所调用的类中的成员函数。
虚继承和虚基类
虚继承:在继承属性前加上 virtual关键字
多继承时很容易产生命名冲突问题,如果我们很小心地将所有类中的成员变量及成员函数都命名为不同的名字时,命名冲突依然有可能发生,比如非常经典的菱形继承结构。
这个时候我们引出虚继承和虚基类的概念,使得在派生类(D类中只保留一份间接基类(A类)成员
class A
{
public:
void setx(int a){x = a;}
int getx(){return x;}
private:
int x;
};
class B: virtual public A //B类虚继承于A类
{
public:
void sety(int a){y = a;}
int gety(){return y;}
private:
int y;
};
class C: virtual public A //C类也虚继承于A类
{
public:
void setz(int a){z = a;}
int getz(){return z;}
private:
int z;
};
class D: public B, public C
{
//......
};
//B类和C类都虚继承于A类,这样就导致继承于B类和C类的D类只会获得A类中相同数据的一份,
//而不是两份,避免命名冲突和语病
//因为虚继承让B类和C类在合成D类时具备悬着性,异实同虚
虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class),本例中的 A 就是一个虚基类。在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。
虚派生只影响从指定了虚基类(A类)的派生类中进一步派生出来的类(D类),它不会影响派生类本身(B类和C类)。