1.多繼承的基本使用
2.當(dāng)一個(gè)派生類,從多個(gè)基類派生,而這些基類又有一個(gè)共同的基類,則對后面這個(gè)原始基類中聲明的屬性進(jìn)行訪問的時(shí)候,會產(chǎn)生二義性.因?yàn)檫@個(gè)類會在多繼承過程中,多次構(gòu)造.所以不知道訪問的是哪一個(gè)屬性.
3.解決這種二義性,通過虛擬繼承,virtual 關(guān)鍵字.
//
// 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<<"構(gòu)造方法---"<<endl;
}
public:
int b = 0;
};
//class B1 : public B{
//private:
// int b1;
//};
//class B2:public B{
//private:
// int b2;
//};
/**
* ? C++提供虛繼承機(jī)制,防止類繼承關(guān)系中成員訪問的二義性笛质。
? 多繼承提供了軟件重用的強(qiáng)大功能,也增加了程序的復(fù)雜性魄揉。
*/
class B1 : virtual public B{
public:
B1(){
cout<<"B1構(gòu)造方法---"<<endl;
}
private:
int b1;
};
class B2: virtual public B{
public:
B2(){
cout<<"B2構(gòu)造方法---"<<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;//不知道 這個(gè)C 是從哪里繼承來的
// 建立C類對象時(shí),B的構(gòu)造函數(shù)將被調(diào)用兩次:一次由B1調(diào)用,另一次由B2調(diào)用,用來初始化C類對象中所有包含的兩個(gè)B
//類的子對象.
C cc;
// cc.b = 10;
return 0;
}