C++多重繼承二義性原理實(shí)例解析
在派生類中對基類成員訪問應(yīng)該是唯一的,但是在多繼承時(shí),可能會導(dǎo)致對基類某成員訪問出現(xiàn)不一致的情況,這就是C++多繼承中的二義性。
有兩種繼承的情況會產(chǎn)生多義性
一、如果一個(gè)派生類從多個(gè)基類派生,而這些基類又有一個(gè)共同的基類,則在對該基類中聲明的成員變量進(jìn)行訪問時(shí),可能產(chǎn)生二義性,繼承關(guān)系如下圖所示:

#include <iostream>
using namespace std;
class A{
public:
int a;
};
class B1 : public A{
public:
int b1;
};
class B2 : public A{
public:
int b2;
};
class C : public B1, public B2{
public:
int c;
};
int main(){
C c1;
c1.b1 = 100;
c1.b2 = 200;
c1.c = 300;
c1.a = 500; //報(bào)錯(cuò),不能確定成員變量a具體在那個(gè)類
cout << "end..." << endl;
system("pause");
return 0;
}
解決方法:虛繼承
注意:C++編譯系統(tǒng)在實(shí)例化C類時(shí),只會將虛基類A的構(gòu)造函數(shù)調(diào)用一次,忽略虛基類的其他派生類(class B1,class B2)對虛繼承的構(gòu)造函數(shù)的調(diào)用,從而保證了虛基類的數(shù)據(jù)成員不會被多次初始化。
在虛基類A中有一個(gè)虛指針指向一個(gè)虛表,虛表中記錄了虛基類與本類的地址偏移,通過這個(gè)地址偏移可以找到虛基類的成員變量a的地址
#include <iostream>
using namespace std;
class A{
public:
int a;
};
class B1 : virtual public A{
public:
int b1;
};
class B2 : virtual public A{
public:
int b2;
};
class C : public B1, public B2{
public:
int c1;
};
int main(){
C c1;
c1.b1 = 100;
c1.b2 = 200;
c1.c1 = 300;
c1.a = 500; //虛繼承使得成員變量a只有一份拷貝,通過虛指針可以確定地址
cout << "end..." << endl;
system("pause");
return 0;
}
二、一個(gè)派生類同時(shí)繼承兩個(gè)基類,這兩個(gè)基類存在相同的成員函數(shù)

#include<iostream>
using namespace std;
class Base1 {
public:
void fun() {
cout << "I am base-1 " << endl;
};
};
class Base2
{
public:
void fun() {
cout << "I am base-2 " << endl;
};
};
class A: public Base1, public Base2 {
public:
void print() {
}
};
int main() {
A obj;
obj.fun(); //調(diào)用的方法產(chǎn)生歧義
system("pause");
return 0;
}
解決方法:使用作用域運(yùn)算符::來解決,明確指向的方法,例如obj.Base1::fun()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c語言中main函數(shù)用法及知識點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于c語言中main函數(shù)用法及知識點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10
C語言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼
這篇文章主要介紹了C語言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
C++數(shù)據(jù)結(jié)構(gòu)模板進(jìn)階的多方面分析
今天我要給大家介紹C++中的模板更深的一些知識。有關(guān)于非類型的模板參數(shù)和模板特化的一些知識,感興趣的朋友快來看看吧2022-02-02

