1.多继承的基本使用
2.当一个派生类,从多个基类派生,而这些基类又有一个共同的基类,则对后面这个原始基类中声明的属性进行访问的时候,会产生二义性.因为这个类会在多继承过程中,多次构造.所以不知道访问的是哪一个属性.
3.解决这种二义性,通过虚拟继承,virtual 关键字.
//
// main.cpp
// C++多继承
//
// Created by 扆佳梁 on 16/8/1.
// Copyright © 2016年 Eric. All rights reserved.
//
#include <iostream>
using namespace std;
class Base1
{
public:
Base1(int x){
value = x;
}
int getData()const{
return value;
}
protected:
int value;
};
class Base2{
public:
Base2(char c){
letter = c;
}
char getData()const{
return letter;
}
char letter;
};
class Derived:public Base1,public Base2{
private:
double real;
friend ostream &operator<<(ostream &,const Derived der);
public:
Derived(int ,char ,double);
double getReal()const;
};
class B{
public:
B(){
cout<<"构造方法---"<<endl;
}
public:
int b = 0;
};
//class B1 : public B{
//private:
// int b1;
//};
//class B2:public B{
//private:
// int b2;
//};
/**
* ¬ C++提供虚继承机制,防止类继承关系中成员访问的二义性。
¬ 多继承提供了软件重用的强大功能,也增加了程序的复杂性。
*/
class B1 : virtual public B{
public:
B1(){
cout<<"B1构造方法---"<<endl;
}
private:
int b1;
};
class B2: virtual public B{
public:
B2(){
cout<<"B2构造方法---"<<endl;
}
private:
int b2;
};
class C :public B1,public B2{
public:
int f();
private:
int d;
};
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
// C c;
// c.B1::b = 10;
// c.B::b = 20;//不知道 这个C 是从哪里继承来的
// 建立C类对象时,B的构造函数将被调用两次:一次由B1调用,另一次由B2调用,用来初始化C类对象中所有包含的两个B
//类的子对象.
C cc;
// cc.b = 10;
return 0;
}