国产探花免费观看_亚洲丰满少妇自慰呻吟_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++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扎赉特旗| 光泽县| 太仆寺旗| 晋中市| 开江县| 双辽市| 湖南省| 贵德县| 香港 | 虎林市| 永新县| 闽侯县| 东方市| 资源县| 石河子市| 麦盖提县| 岚皋县| 旬邑县| 十堰市| 泰州市| 依兰县| 安塞县| 西乌珠穆沁旗| 曲周县| 武城县| 甘德县| 浦东新区| 巴里| 陆良县| 江永县| 航空| 阿鲁科尔沁旗| 博客| 宁河县| 广宁县| 青神县| 商丘市| 抚州市| 浑源县| 昭通市| 阳原县|