91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++之菱形繼承

發布時間:2020-09-11 22:31:35 來源:網絡 閱讀:1632 作者:Zimomomo 欄目:編程語言

    當我們談C++時,我們談些什么?

    封裝,繼承,多態。這是C++語言的三大特性,而每次在談到繼承時我們不可避免的要談到一個很重要的問題——菱形繼承。

a.菱形繼承是什么

C++之菱形繼承

    如上圖,菱形繼承即多個類繼承了同一個公共基類,而這些派生類又同時被一個類繼承。這么做會引發什么問題呢,讓我們來看一段代碼吧!

#include<iostream>
using namespace std;
class Base
{
protected:
	int _base;
public:
	void fun()
	{
		cout << "Base::fun" << endl;
	}
};

class A:public Base
{
protected:
	int _a;
};

class B : public Base
{
protected:
	int _b;
};
class D :public A, public B
{
private:
	int _d;
};
int main()
{
	D d;
	d.fun();//編譯器報錯:調用不明確
	getchar();
}

    我們可以看見D的對象模型里面保存了兩份Base,當我們想要調用我們從Base里繼承的fun時就會出現調用不明確問題,并且會造成數據冗余的問題,明明可以只要一份就好,而我們卻保存了兩份。

    那么我們可以怎樣解決呢?

    第一種解決方法,使用域限定我們所需訪問的函數

int main()
{
	D d;
	d.A::fun();
	d.B::fun();
	getchar();
}

    這樣的做法是沒有問題的,但是,這樣做非常的不方便,并且當程序十分大的時候會造成我們思維混亂

    于是,C++給了我們一個別的解決方案——虛繼承

b.虛繼承

    虛繼承是什么?

C++之菱形繼承

    如上圖,虛繼承即讓A和B在繼承Base時加上virtural關鍵字,這里需要記住不是D使用虛繼承

    那么,虛繼承又是怎么解決這些煩人的問題的呢?

C++之菱形繼承

    我們可看見在A和B中不再保存Base中的內容,保存了一份偏移地址,然后將Base的數據保存在一個公共位置處這樣保證了數據冗余性的降低同時,我們也能直接的使用d.fun()來調用Base里的fun函數。

#include<iostream>
using namespace std;
class Base
{
protected:
	int _base;
public:
	void fun()
	{
		cout << "Base::fun" << endl;
	}
};

class A:virtual public Base
{
protected:
	int _a;
};

class B :virtual public Base
{
protected:
	int _b;
};
class D :public A, public B
{
private:
	int _d;
};
int main()
{
	D d;
	d.fun();
	getchar();
}

    *虛繼承和虛函數是完全不同的兩個概念,希望大家不要隨意搞混,想要了解虛函數的同學可以看看博主的另一篇博文《C++的繼承&多態》http://zimomo.blog.51cto.com/10799874/1752936


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

老河口市| 会东县| 沁源县| 当雄县| 秦安县| 古丈县| 武安市| 金堂县| 宁晋县| 宜宾县| 元氏县| 阜宁县| 峨眉山市| 库尔勒市| 慈溪市| 罗山县| 巫溪县| 雅安市| 左贡县| 仪陇县| 昌宁县| 喜德县| 天全县| 垦利县| 敦化市| 古田县| 绥中县| 平罗县| 南乐县| 平顺县| 浪卡子县| 四会市| 邵武市| 大同县| 兰坪| 桃江县| 乌鲁木齐市| 若尔盖县| 大余县| 广南县| 交城县|