原創:
在c++中乙個類可以從多個基類中派生(即可以有多個父類),這就是多繼承。多繼承的方式主要有兩種:
類c會同時擁有類a和類b的特性(屬性和方法,也就是兩個類的所有成員)。這種方式很簡單這裡就不多說,主要講下面這種方式。
同樣的,這個結構中類c也會同時擁有類a和類b的特性,但這就會有乙個問題,類b1和b2都繼承自a,那麼類c的物件會同時包含兩個a的物件。這樣就會帶來很多歧義性。
我們看乙個典型的例子「沙發-床」:
類的關係圖
**:
#pragma once
#include
#include
using namespace std;
class furniture
furniture(double weight) : m_weight(weight){}
~furniture(void){}
double getweight() const
void setweight(double val)
private:
double m_weight;
};class bed : public furniture
bed(double weight, int second) : furniture(weight), m_second(second){}
void sleep(int second)
private:
int m_second;
};class sofa : public furniture
sofa(double weight) : furniture(weight){}
void watchtv(string programme)
};class sleepsofa : public bed, public sofa
sleepsofa(double weight, int second) : bed(weight, second), sofa(weight) {}
void foldout()
};
sleepsofa類繼承自bed和sofa兩個類,因此,sleepsofa類擁有這兩個類的特性,但在實際編碼中會存在如下幾個問題。
1.sleepsofa類該如何定義?
class sleepsofa : public bed, public sofa
構造順序為:bed sofa sleepsofa (也就是書寫的順序)
2.bed和sofa類都繼承自furniture,都有weight屬性也都有getweight和setweight方法,在sleepsofa類中使用這些屬性和方法時,如何確定呼叫的是哪個類的成員?
我們看一下測試樣例:
void test()
這時會有以下錯誤:
.cpp(76): error c3861: 『setweight』: identifier not found就是說setweight和getweight是有歧義的。error c2385: ambiguous access of 『getweight』
解決方法:
(1). 可以使用完全限定名(即加上類的作用域)的方式,比如:
sleepsofa sleepsofa;
sleepsofa.bed::setweight(55);
sleepsofa.sofa::setweight(80);
這時可以看到sleepsofa物件有兩個furniture物件。如下:
(2). 虛繼承
倘若,我們定義乙個sleepsofa物件,讓我們分析一下它的構造過程:它會構造bed類和sofa類,但bed類和sofa類都有乙個父類,因此furniture類被構造了兩次,這是不合理的,因此,我們引入了虛繼承的概念。
class furniture;
class bed : virtual public furniture; // 這裡我們使用虛繼承
class sofa : virtual public furniture;// 這裡我們使用虛繼承
class sleepsofa : public bed, public sofa ;
這樣,furniture類就只會構造一次,sleepsofa物件只會包含乙個furniture物件。
我們看一下測試樣例:
sleepsofa sleepsofa;
sleepsofa.setweight(80);
這時我們debug模式可以看到sleepsofa的m_weight值都是80。
這裡雖然顯示著兩個furniture物件,但其實指向的是同乙個物件。我們可以看看它們的位址都是一樣的。
在程式設計中最好不要出現多繼承,要有也是繼承多個作為介面使用抽象類(只宣告需要的功能,沒有具體的實現)。因為出現一般的多繼承本身就是一種不好的物件導向程式設計。
在出現版本2的多繼承時使用虛繼承的方式。
原創:
在c++中乙個類可以從多個基類中派生(即可以有多個父類),這就是多繼承。多繼承的方式主要有兩種:
類的繼承 多繼承
多繼承要注意很多地方,以下 只是最基本多繼承方式,下面會講到多繼承的基本格式和繼承方法 簡單說明 1 如果在子類中需要父類的構造方法就需要顯示的呼叫父類的構造方法,或者不重寫父類的構造方法。2 在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上 self 引數變數。區別在於類中呼叫普通函式時並不...
C C程式設計學習 梳理10 函式的指標
原文 函式指標是指指向函式而非指向物件的指標。像其他指標一樣,函式指標也指向某個特定的型別 特定的函式型別 函式型別由其返回型別以及形參表確定,而與函式名無關。如下宣告了乙個函式指標 bool pfunc int,double 這個語句將pfunc宣告為指向函式的指標,它所指向的函式帶有兩個型別分別...
Python學習19 python類的繼承
父類 子類 繼承如何表示?class 子類名 父類名 pass子類可以實現自己獨有的方法 重寫 super 超繼承 使用父類當中的方法 例項1 class man name man def init self self.name print man.name print man csdn name ...