簡體   English   中英

抽象類和繼承

[英]Abstract class and inheritance

class MyInterface {
public:
    virtual void someFunction()= 0;
};

class X: public MyInterface {
private:
    virtual void doThis() {
        printf("This X");
    }
    virtual void doThat() {
        printf("That X");
    }
public:
    void someFunction() {
        doThis();
        doThat();
    }
};

class Y: public MyInterface, private X {
private:
    void doThat() {
        printf("That Y");
    }
};

MyInterface *iface= new Y();
Y->someFunction();

來自Java的OOP風格,我試圖將頭圍在C ++的OOP模型上。 我已閱讀: http : //www.gotw.ca/publications/mill18.htm,以獲取有關如何在C ++中設計接口的建議。 上面的代碼是作者闡述的規則的直接應用(或其微小變化)。 我的問題是,上面的代碼是否會產生“ This X”和“ That Y”? 我感到困惑的是,作者建議結合使用virtualprivate 我的推論是,如果一個函數是private ,那么我們該如何覆蓋它呢? 在上面的代碼中,由於我們是從接口公開派生的,因此可以將Y用作賦值的右側。 當我們在其上調用someFunction()時,由於我們沒有在class Y內顯式提供任何實現,它將使用class X的實現嗎? 然后,如果有的話,它會查看doThat()並再次使用Y的實現?

該代碼有一些問題。 這是一個工作示例:

class MyInterface
{
public:
    virtual ~MyInterface() { }
    virtual void someFunction() = 0;
};

class X : public MyInterface
{
private:
    virtual void doThis()
    {
        printf("This X\n");
    }
    virtual void doThat()
    {
        printf("That X\n");
    }

public:
    void someFunction()
    {
        doThis();
        doThat();
    }
};

class Y : public X
{
private:
    void doThat()
    {
        printf("That Y\n");
    }
};

int main()
{
    MyInterface *iface = new Y();
    iface->someFunction();
    delete iface;
}

說明

  1. 您需要使用class Y : public X才能使用void X::someFunction()的實現。

    不幸的是,C ++中沒有真正的接口,只有使用純虛擬類的解決方法。 有兩個父母的解決方法有其自身的局限性(請參見下面的內容) 因此,在接口定義中添加析構函數也是一個好主意。

    當使用class Y: public MyInterface, private X您需要提供MyInterface::someFunction()的自定義實現。 您在兩個父級XMyInterface )中都有兩個父類和someFunction() 即使只有一種功能實現,這也是必要的。 因此,您需要指定將使用哪個父類“實現”。 錯誤:

    'Y':無法實例化抽象類

    刪除接口(嘗試從X使用接口)時,也會出現錯誤。 原因很簡單,當X為私有時,實現不是公開的,不能用作接口。

    '類型轉換':存在從'Y *'到'MyInterface *'的轉換,但是無法訪問

  2. 您正在使用類作為Y->someFunction();

  3. 我不知道為什么您可以覆蓋私有虛擬功能。 我現在主要在C#中工作,而C ++的這一“功能”是我無法理解的。 沒錯,這應該是錯誤的代碼,但它可以正常工作(至少在Visual Studio 2017中)

    我也想知道,為什么這不被認為是錯誤/不正確的代碼構造。

暫無
暫無

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

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