[英]Pure virtual functions and multiple inheritance
我有一個(保證的樹形)級聯類
class rock_bottom {
...
virtual foo() = 0;
};
class A : rock_bottom {...}
class intermediate: rock_bottom {...}
class B : intermediate {...}
class higher_up {...}
class C : higher_up {...}
我想在字母類A,B,C中實現foo()。在哪里需要聲明foo? (虛擬的?純的?)我是否需要在中間層中級和Higher_up的(簡單的)實現?
題:
我想在字母類A,B,C中實現foo()。我需要在哪里聲明
foo
? (虛擬的?純凈的?)
回答:
這個問題需要反過來提出。 在哪個基類中創建接口foo
才有意義。 讓我們來看一些您可能在應用程序中找到的類。
struct Shape {};
struct Rectangle : public Shape {};
struct Square : public Rectangle {};
struct Ellipse : public Shape {};
struct Circle : public Ellipse {};
所有Shape
都可以返回其面積和周長,這是有道理的。 因此,您將它們作為virtual
成員函數放在Shape
。
struct Shape
{
virtual double area() const = 0;
virtual double perimeter() const = 0;
};
在創建Shape
的子類型實例之前,必須實現它們。
如果您希望能夠創建Rectangle
,則這些功能必須在Rectangle
實現,因為沒有其他中間類。
如果您希望能夠創建Square
,則必須在Rectangle
, Square
或兩者中實現這些功能。
同樣,如果您希望能夠創建Ellipse
,則這些功能必須在Ellipse
實現,因為沒有其他中間類。
如果您希望能夠創建Circle
,那么必須在Ellipse
, Circle
或兩者中都實現這些功能。
但是,只有Rectangle
具有長度和寬度。 只有Ellipse
才具有長半徑和短半徑。 在Shape
添加虛擬成員函數以返回這些值沒有意義。
題:
我是否需要在中間層中級和Higher_up中實現(瑣碎的)實現?
回答:
不,你沒有。 上一個問題的答案應對此進行更多說明。
每個覆蓋都需要在實現它的類中聲明; 在您的情況下, A
, B
和C
,因為您說每個都會提供覆蓋。
假設您對它們保持抽象感到滿意,則無需在任何中間類中聲明它。 他們從rock_bottom
繼承了純函數,而用另一個純函數覆蓋它是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.