本文實例講述了C++多重繼承引發的重復調用問題與解決方法。分享給大家供大家參考,具體如下:
前面簡單介紹了一個C++多重繼承功能示例,這里再來分析一個多重繼承引發的重復調用問題,先來看看問題代碼:
#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()函數  void f()  {    cout << "a = " << a << endl;    R::f();//r是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數f()  }};//虛繼承class B : virtual public R{private:  int b;public:  B(int x, int y) :R(x), b(y) {}  //重寫父類的f()函數  void f()  {    cout << "b = " << b << endl;    R::f();//r是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數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    //從而導致重復調用,兩次輸出 r  }};int main(){  C cc(1212, 345, 123, 45);  cc.f();  system("pause");  return 0;}解決辦法:針對重復調用,每個類把屬于自己的工作單獨封裝
修改后的代碼如下:
#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()//增加一個保護函數,只打印自己的擴展成員  {    cout << "a = " << a << endl;  }  void f()//重寫父類的f()函數  {    //cout << "a = " << a << endl;    fA();    R::f();//r是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數f()  }};//虛繼承class B : virtual public R{private:  int b;public:  B(int x, int y) :R(x), b(y) {}protected:  void fB()//增加一個保護函數,只打印自己的擴展成員  {    cout << "b = " << b << endl;  }  void f()//重寫父類的f()函數  {    fB();    R::f();//r是私有成員變量,不能直接訪問,通過作用域進行訪問被派生類覆蓋的函數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    //從而導致重復調用,兩次輸出 r    fA();//A::fA();    fB();//A::fB();  }};int main(){  C cc(1212, 345, 123, 45);  cc.f();  system("pause");  return 0;}希望本文所述對大家C++程序設計有所幫助。
新聞熱點
疑難解答
圖片精選