C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法
更新時間:2018年05月15日 10:30:25 作者:止語---
這篇文章主要介紹了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法,結(jié)合具體實例形式分析了C++多重調(diào)用中的重復(fù)調(diào)用問題及相應(yīng)的解決方法,需要的朋友可以參考下
本文實例講述了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法。分享給大家供大家參考,具體如下:
前面簡單介紹了一個C++多重繼承功能示例,這里再來分析一個多重繼承引發(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();//此時A里面有一個 r 的輸出,和輸出a
B::f();//B里面也有一個r的輸出,和輸出b
//從而導(dǎo)致重復(fù)調(diào)用,兩次輸出 r
}
};
int main()
{
C cc(1212, 345, 123, 45);
cc.f();
system("pause");
return 0;
}
解決辦法:針對重復(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; }
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()//增加一個保護(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()//增加一個保護(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();//此時A里面有一個 r 的輸出,和輸出a
//B::f();//B里面也有一個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;
}
希望本文所述對大家C++程序設(shè)計有所幫助。
相關(guān)文章
cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢
這篇文章主要為大家詳細(xì)介紹了cocos2dx實現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
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
解析一個有關(guān)sizeof用法的題目--sizeof(i++)
本篇文章是對一個關(guān)于sizeof用法的題目進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

