C++多重繼承二義性原理實(shí)例解析
在派生類中對(duì)基類成員訪問(wèn)應(yīng)該是唯一的,但是在多繼承時(shí),可能會(huì)導(dǎo)致對(duì)基類某成員訪問(wèn)出現(xiàn)不一致的情況,這就是C++多繼承中的二義性。
有兩種繼承的情況會(huì)產(chǎn)生多義性
一、如果一個(gè)派生類從多個(gè)基類派生,而這些基類又有一個(gè)共同的基類,則在對(duì)該基類中聲明的成員變量進(jìn)行訪問(wè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í),只會(huì)將虛基類A的構(gòu)造函數(shù)調(diào)用一次,忽略虛基類的其他派生類(class B1,class B2)對(duì)虛繼承的構(gòu)造函數(shù)的調(diào)用,從而保證了虛基類的數(shù)據(jù)成員不會(huì)被多次初始化。
在虛基類A中有一個(gè)虛指針指向一個(gè)虛表,虛表中記錄了虛基類與本類的地址偏移,通過(guò)這個(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只有一份拷貝,通過(guò)虛指針可以確定地址
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)算符::來(lái)解決,明確指向的方法,例如obj.Base1::fun()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++?棧和隊(duì)列的實(shí)現(xiàn)超詳細(xì)解析
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對(duì)一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-03-03
strcat函數(shù)與strncat函數(shù)的深入分析
本篇文章是對(duì)strcat函數(shù)與strncat函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言實(shí)現(xiàn)支持動(dòng)態(tài)拓展和銷毀的線程池
這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)支持動(dòng)態(tài)拓展和銷毀的線程池,感興趣的小伙伴們可以參考一下2016-01-01
C++ windows LOG4plus的使用小結(jié)
這篇文章主要介紹了C++ windows LOG4plus的使用小結(jié),本文通過(guò)圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05
C++ 中時(shí)間與時(shí)間戳的轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了C++ 中時(shí)間與時(shí)間戳的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06

