C++多重繼承引發(fā)的重復調(diào)用問題與解決方法
更新時間:2018年05月15日 10:30:25 作者:止語---
這篇文章主要介紹了C++多重繼承引發(fā)的重復調(diào)用問題與解決方法,結(jié)合具體實例形式分析了C++多重調(diào)用中的重復調(diào)用問題及相應(yīng)的解決方法,需要的朋友可以參考下
本文實例講述了C++多重繼承引發(fā)的重復調(diào)用問題與解決方法。分享給大家供大家參考,具體如下:
前面簡單介紹了一個C++多重繼承功能示例,這里再來分析一個多重繼承引發(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是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數(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是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數(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();//此時A里面有一個 r 的輸出,和輸出a B::f();//B里面也有一個r的輸出,和輸出b //從而導致重復調(diào)用,兩次輸出 r } }; int main() { C cc(1212, 345, 123, 45); cc.f(); system("pause"); return 0; }
解決辦法:針對重復調(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; } 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()//增加一個保護函數(shù),只打印自己的擴展成員 { cout << "a = " << a << endl; } void f()//重寫父類的f()函數(shù) { //cout << "a = " << a << endl; fA(); R::f();//r是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數(shù)f() } }; //虛繼承 class B : virtual public R { private: int b; public: B(int x, int y) :R(x), b(y) {} protected: void fB()//增加一個保護函數(shù),只打印自己的擴展成員 { cout << "b = " << b << endl; } void f()//重寫父類的f()函數(shù) { fB(); R::f();//r是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數(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();//此時A里面有一個 r 的輸出,和輸出a //B::f();//B里面也有一個r的輸出,和輸出b //從而導致重復調(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è)計有所幫助。
相關(guān)文章
cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細介紹了cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價值,感興趣的小伙伴們可以參考一下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解析一個有關(guān)sizeof用法的題目--sizeof(i++)
本篇文章是對一個關(guān)于sizeof用法的題目進行了詳細的分析介紹,需要的朋友參考下2013-06-06