国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++多重繼承引發的重復調用問題與解決方法

2020-01-26 13:42:23
字體:
來源:轉載
供稿:網友

本文實例講述了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++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 始兴县| 松潘县| 保山市| 南丹县| 贵南县| 隆昌县| 克什克腾旗| 贵溪市| 合阳县| 琼中| 桂平市| 娱乐| 江华| 稻城县| 娄底市| 监利县| 三门峡市| 翁牛特旗| 嫩江县| 桑日县| 梁山县| 芷江| 柘城县| 太康县| 峨眉山市| 民丰县| 凤城市| 随州市| 上蔡县| 青浦区| 泸定县| 万年县| 武夷山市| 城口县| 丹巴县| 黑龙江省| 福鼎市| 那曲县| 巴彦淖尔市| 韩城市| 哈密市|