C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法
本文實(shí)例講述了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法。分享給大家供大家參考,具體如下:
前面簡(jiǎn)單介紹了一個(gè)C++多重繼承功能示例,這里再來分析一個(gè)多重繼承引發(fā)的重復(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是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(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是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(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();//此時(shí)A里面有一個(gè) r 的輸出,和輸出a
B::f();//B里面也有一個(gè)r的輸出,和輸出b
//從而導(dǎo)致重復(fù)調(diào)用,兩次輸出 r
}
};
int main()
{
C cc(1212, 345, 123, 45);
cc.f();
system("pause");
return 0;
}
解決辦法:針對(duì)重復(fù)調(diào)用,每個(gè)類把屬于自己的工作單獨(dú)封裝
修改后的代碼如下:
#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()//增加一個(gè)保護(hù)函數(shù),只打印自己的擴(kuò)展成員
{
cout << "a = " << a << endl;
}
void f()//重寫父類的f()函數(shù)
{
//cout << "a = " << a << endl;
fA();
R::f();//r是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(shù)f()
}
};
//虛繼承
class B : virtual public R
{
private:
int b;
public:
B(int x, int y) :R(x), b(y) {}
protected:
void fB()//增加一個(gè)保護(hù)函數(shù),只打印自己的擴(kuò)展成員
{
cout << "b = " << b << endl;
}
void f()//重寫父類的f()函數(shù)
{
fB();
R::f();//r是私有成員變量,不能直接訪問,通過作用域進(jìn)行訪問被派生類覆蓋的函數(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();//此時(shí)A里面有一個(gè) r 的輸出,和輸出a
//B::f();//B里面也有一個(gè)r的輸出,和輸出b
//從而導(dǎo)致重復(fù)調(diào)用,兩次輸出 r
fA();//A::fA();
fB();//A::fB();
}
};
int main()
{
C cc(1212, 345, 123, 45);
cc.f();
system("pause");
return 0;
}
希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。
相關(guān)文章
對(duì)比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法
這篇文章主要介紹了對(duì)比C語言中memccpy()函數(shù)和memcpy()函數(shù)的用法,二者都是用于復(fù)制內(nèi)存內(nèi)容,注意區(qū)別,需要的朋友可以參考下2015-08-08
VSCode搭建STM32開發(fā)環(huán)境的實(shí)現(xiàn)步驟
因?yàn)閂SCode免費(fèi)且好用,可以安裝各種插件,本文主要介紹了VSCode搭建STM32開發(fā)環(huán)境的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的查找和建立
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的查找和建立,感興趣的可以學(xué)習(xí)一下2022-09-09
c++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)
下面小編就為大家?guī)硪黄猚++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
C++類與對(duì)象深入之靜態(tài)成員與友元及內(nèi)部類詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對(duì)我們對(duì)C++的靜態(tài)成員,友元,內(nèi)部類知識(shí)點(diǎn)做出總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步2022-06-06
Qt+OpenCV實(shí)現(xiàn)目標(biāo)檢測(cè)詳解
這篇文章主要介紹了如何利用Qt和OpenCV中自帶xml文件實(shí)現(xiàn)目標(biāo)檢測(cè),文中的實(shí)現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試2022-03-03

