新聞中心
這篇文章主要介紹如何解決C++多重繼承引發(fā)的重復(fù)調(diào)用的問(wèn)題,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)臨湘免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
分析一個(gè)多重繼承引發(fā)的重復(fù)調(diào)用問(wèn)題,先來(lái)看看問(wèn)題代碼:
#include "stdafx.h" #include#include using namespace std; class R//祖先類(lèi) { private: int r; public: R(int x = 0):r(x){} void f() { cout << " r = " << r << endl; } void print() { cout << "print R = " << r << endl; } }; //虛繼承 class A : virtual public R { private: int a; public: A(int x,int y):R(x),a(y){} //重寫(xiě)父類(lèi)的f()函數(shù) void f() { cout << "a = " << a << endl; R::f();//r是私有成員變量,不能直接訪(fǎng)問(wèn),通過(guò)作用域進(jìn)行訪(fǎng)問(wèn)被派生類(lèi)覆蓋的函數(shù)f() } }; //虛繼承 class B : virtual public R { private: int b; public: B(int x, int y) :R(x), b(y) {} //重寫(xiě)父類(lèi)的f()函數(shù) void f() { cout << "b = " << b << endl; R::f();//r是私有成員變量,不能直接訪(fǎng)問(wèn),通過(guò)作用域進(jìn)行訪(fǎng)問(wèn)被派生類(lèi)覆蓋的函數(shù)f() } }; class C :public A, public B { private: int c; public: C(int x,int y,int z,int m):R(x),A(x,y),B(x,z),c(m) { } void f() { cout << "c = " << c << endl; A::f();//此時(shí)A里面有一個(gè) r 的輸出,和輸出a B::f();//B里面也有一個(gè)r的輸出,和輸出b //從而導(dǎo)致重復(fù)調(diào)用,兩次輸出 r } }; int main() { C cc(1212, 345, 123, 45); cc.f(); system("pause"); return 0; }
解決辦法:針對(duì)重復(fù)調(diào)用,每個(gè)類(lèi)把屬于自己的工作單獨(dú)封裝
修改后的代碼如下:
#include "stdafx.h" #include#include using namespace std; class R//祖先類(lèi) { private: int r; public: R(int x = 0):r(x){} void f() { cout << " r = " << r << endl; } virtual void print() { cout << "print R = " << r << endl;} }; //虛繼承 class A : virtual public R//virtual寫(xiě)在public的前后均可以 { private: int a; public: A(int x,int y):R(x),a(y){ } protected: void fA()//增加一個(gè)保護(hù)函數(shù),只打印自己的擴(kuò)展成員 { cout << "a = " << a << endl; } void f()//重寫(xiě)父類(lèi)的f()函數(shù) { //cout << "a = " << a << endl; fA(); R::f();//r是私有成員變量,不能直接訪(fǎng)問(wèn),通過(guò)作用域進(jìn)行訪(fǎng)問(wèn)被派生類(lèi)覆蓋的函數(shù)f() } }; //虛繼承 class B : virtual public R { private: int b; public: B(int x, int y) :R(x), b(y) {} protected: void fB()//增加一個(gè)保護(hù)函數(shù),只打印自己的擴(kuò)展成員 { cout << "b = " << b << endl; } void f()//重寫(xiě)父類(lèi)的f()函數(shù) { fB(); R::f();//r是私有成員變量,不能直接訪(fǎng)問(wèn),通過(guò)作用域進(jìn)行訪(fǎng)問(wèn)被派生類(lèi)覆蓋的函數(shù)f() } }; class C :public A, public B { private: int c; public: C(int x,int y,int z,int m):R(x),A(x,y),B(x,z),c(m) { } void f() { cout << "c = " << c << endl; R::f(); //A::f();//此時(shí)A里面有一個(gè) r 的輸出,和輸出a //B::f();//B里面也有一個(gè)r的輸出,和輸出b //從而導(dǎo)致重復(fù)調(diào)用,兩次輸出 r fA();//A::fA(); fB();//A::fB(); } }; int main() { C cc(1212, 345, 123, 45); cc.f(); system("pause"); return 0; }
以上是“如何解決C++多重繼承引發(fā)的重復(fù)調(diào)用的問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站標(biāo)題:如何解決C++多重繼承引發(fā)的重復(fù)調(diào)用的問(wèn)題
分享網(wǎng)址:http://fisionsoft.com.cn/article/giijjo.html