簡體   English   中英

從基類的指針訪問派生類的成員

[英]Access member of derived class from pointer of base class

我有一個派生自另一個的類,我使用一個基類指針數組來保存派生類的實例,但由於該數組屬於基類,我無法使用指針表示法訪問屬於派生類的成員,我可以通過一個簡單的命令訪問這些成員,或者我應該只重寫我的基類來定義成員並只在派生類中使用它?

例:

class A {
public:
    int foo;
};

class B : public A {
public:
    char bar;
};

class C : public A {
    int tea;
};

int main() {
    A * arr[5];
    arr[0] = new B;

    char test = arr[0]->bar; //visual studio highlights this with an error "class A has no member bar"

    return 0;
}

我無法使用指針表示法訪問屬於派生類的成員

這是設計的:您沒有告訴編譯器指針指向的對象是派生類型。

我是否可以通過簡單的命令訪問這些成員

如果你100%確定指針指向B ,你可以執行static_cast<B*>(arr[0]) ,但是應該使用強制解決方案作為最后的手段。 相反,您應該在基類中派生成員函數,並在派生類中提供實現:

class A {
public:
    int foo;
    virtual char get_bar() = 0;
};

class B : public A {
    char bar;
public:
    char get_bar() {
        return bar;
    }
};

閱讀關於類型轉換的內容 ,它是該語言的一個非常基本和重要的方面。

簡而言之,您始終可以將指向基類的指針強制轉換為指向派生的指針,然后引用其唯一的公共成員。

A * arr[5];
arr[0] = new B;

char test = static_cast<B*>(arr[0])->bar;

但是,即使A*實際上沒有指向B類型的對象,上面的最后一行也是有效的語句。 如果在C對象上嘗試,它將進行編譯,並在運行時導致未定義的行為。

然而,應該提到的是,通常當一個人無法確定他所提到的對象的類型時,更好的程序設計可能會從一開始就阻止它。 一個普遍的說法是,一般來說,鑄造都是如此。

PS請注意,在你的代碼中, barclass B的私有成員(我無意中假設。默認情況下, class任何成員都是私有的),因此無論如何都不能在class B實現之外訪問它。

如果是您的代碼,派生類的成員是私有的。 因此,您無法從基類訪問它。 如果要訪問,則必須將派生類的成員更改為“public”。 您應該像這樣修復您的代碼:

class B : public A {
public:
    char bar;
};

int main() {
A * arr[5];
arr[0] = new B;

char test = static_cast <B *>(arr[0])->bar; //visual studio highlights this with an error "class A has no member bar"
return 0;

}

暫無
暫無

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

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