C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法
更新時(shí)間:2018年05月15日 10:30:25 作者:止語---
這篇文章主要介紹了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法,結(jié)合具體實(shí)例形式分析了C++多重調(diào)用中的重復(fù)調(diào)用問題及相應(yīng)的解決方法,需要的朋友可以參考下
本文實(shí)例講述了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法。分享給大家供大家參考,具體如下:
前面簡單介紹了一個(gè)C++多重繼承功能示例,這里再來分析一個(gè)多重繼承引發(fā)的重復(fù)調(diào)用問題,先來看看問題代碼:
#include "stdafx.h" #include<stdlib.h> #include<iostream> using namespace std; class R//祖先類 { 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){} //重寫父類的f()函數(shù) void f() { cout << "a = " << a << endl; R::f();//r是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(shù)f() } }; //虛繼承 class B : virtual public R { private: int b; public: B(int x, int y) :R(x), b(y) {} //重寫父類的f()函數(shù) void f() { cout << "b = " << b << endl; R::f();//r是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(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; }
解決辦法:針對重復(fù)調(diào)用,每個(gè)類把屬于自己的工作單獨(dú)封裝
修改后的代碼如下:
#include "stdafx.h" #include<stdlib.h> #include<iostream> using namespace std; class R//祖先類 { 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寫在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()//重寫父類的f()函數(shù) { //cout << "a = " << a << endl; fA(); R::f();//r是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(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()//重寫父類的f()函數(shù) { fB(); R::f();//r是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(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++程序設(shè)計(jì)有所幫助。
相關(guān)文章
cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細(xì)介紹了cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別詳析
C++中sort()和priority_queue都能自定義比較函數(shù),其中sort()自定義的比較函數(shù)比較好理解,priority_queue中自定義的比較函數(shù)的效果和sort()是相反的,這篇文章主要給大家介紹了關(guān)于C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-03-03解析一個(gè)有關(guān)sizeof用法的題目--sizeof(i++)
本篇文章是對一個(gè)關(guān)于sizeof用法的題目進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06