亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)文章

  • C++ 私有析構(gòu)函數(shù)的作用示例詳解

    C++ 私有析構(gòu)函數(shù)的作用示例詳解

    這篇文章主要介紹了C++ 私有析構(gòu)函數(shù)的作用,私有析構(gòu)函數(shù)不會影響棧上對象的自動析構(gòu),它們會在其作用域結(jié)束時自動調(diào)用析構(gòu)函數(shù)。私有析構(gòu)函數(shù)主要影響的是對堆上對象的顯式刪除操作,需要的朋友可以參考下
    2023-06-06
  • cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢

    cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢

    這篇文章主要為大家詳細介紹了cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別詳析

    C++中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
  • C語言實現(xiàn)一個簡易通訊錄

    C語言實現(xiàn)一個簡易通訊錄

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)一個簡易通訊錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++簡明分析臨時對象是什么

    C++簡明分析臨時對象是什么

    對性能來說,許多的問題都需要和出現(xiàn)頻率及本身執(zhí)行一次的開銷掛鉤,有些問題雖然看似比較開銷較大,但是很少會執(zhí)行到,那也不會對程序有大的影響;同樣一個很小開銷的函數(shù)執(zhí)行很頻繁,同樣會對程序的執(zhí)行效率有很大影響。本章中作者主要根據(jù)臨時對象來闡述這樣一個觀點
    2022-04-04
  • socket多人聊天程序C語言版(二)

    socket多人聊天程序C語言版(二)

    這篇文章主要為大家詳細介紹了socket多人聊天程序C語言版第二篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C++?std::thread?使用方法

    C++?std::thread?使用方法

    這篇文章主要介紹了C++?std::thread?如何使用,C++中的std::thread類提供了一種方便的多線程編程方式,在使用std::thread類時,我們需要注意線程間的同步和通信問題,以確保多個線程之間的正確協(xié)同工作需要的朋友可以參考下
    2023-03-03
  • C++ 之explicit關(guān)鍵字

    C++ 之explicit關(guān)鍵字

    今天我們來談?wù)凜++中的explicit關(guān)鍵字,這篇文章詳細介紹了C語言的關(guān)鍵字explicit關(guān)鍵字,本文有詳細的代碼實例,感興趣的同學可以借鑒參考
    2023-04-04
  • 解析一個有關(guān)sizeof用法的題目--sizeof(i++)

    解析一個有關(guān)sizeof用法的題目--sizeof(i++)

    本篇文章是對一個關(guān)于sizeof用法的題目進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • C++ map詳解

    C++ map詳解

    下面小編就為大家?guī)硪黄獪\談c++中的map。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10

最新評論