簡體   English   中英

純虛函數和多重繼承

[英]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 ,則必須在RectangleSquare或兩者中實現這些功能。

同樣,如果您希望能夠創建Ellipse ,則這些功能必須在Ellipse實現,因為沒有其他中間類。

如果您希望能夠創建Circle ,那么必須在EllipseCircle或兩者中都實現這些功能。

但是,只有Rectangle具有長度和寬度。 只有Ellipse才具有長半徑和短半徑。 Shape添加虛擬成員函數以返回這些值沒有意義。

題:

我是否需要在中間層中級和Higher_up中實現(瑣碎的)實現?

回答:

不,你沒有。 上一個問題的答案應對此進行更多說明。

每個覆蓋都需要在實現它的類中聲明; 在您的情況下, ABC ,因為您說每個都會提供覆蓋。

假設您對它們保持抽象感到滿意,則無需在任何中間類中聲明它。 他們從rock_bottom繼承了純函數,而用另一個純函數覆蓋它是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM