簡體   English   中英

C ++多態性訪問基類的派生類字段

[英]C++ polymorphism access derived class fields from base class

我有以下程序:

#include <iostream>

class Base {};

class Deriv : public Base
{
    public:
        int data;
        Deriv(int data): data(data) {} 
};

int main()
{
    Base *t = new Deriv(2);
    std::cout << t->data << std::endl;
}

當我編譯它時,出現錯誤:

x.cpp: In function ‘int main()’:
x.cpp:15:21: error: ‘class Base’ has no member named ‘data’

如何獲得對數據字段的訪問權限(請注意,我不想使用Deriv * t = new Deriv(2))?

將其放在基類上:

virtual int get_data() const=0;

然后派生類將需要實現它-所有派生類的所有數據都將通過接口:

class Base
{
    virtual int get_data() const = 0;
};

class Deriv: public Base
{
public:
    int data;
    Deriv(int data): data(data) {} 
    virtual int get_data() const
    { return data; }
};

對象t具有指向Base指針,而Base沒有定義data成員,這就是您的代碼無法編譯的原因。 如果可以肯定地知道t指向Deriv類型的實際對象(就像您發布的代碼一樣),則可以對其進行Deriv以調用Deriv成員:

Deriv* d = static_cast<Deriv*>(t);
std::cout << d->data << std::endl;

如果您不知道t指向Deriv類型的實際對象,則需要通過dynamic_cast將其多態下變換並檢查返回值:

Deriv* d = dynamic_cast<Deriv*>(t);
if (d != nullptr)
{
    std::cout << d->data << std::endl;
}

無論如何,根據發布的代碼,如果僅將t聲明為僅由Deriv定義的數據成員,則將t聲明為Base*並不會帶來任何好處。

您已將指針聲明為Base類型,並且編譯器正確,該類中沒有成員data 您需要將指針Deriv*Deriv* ,才能以這種方式訪問​​成員。 無論如何,為什么要使類型的指針指向基類? 僅在具有多態類層次結構時,這通常才有用。

您可以考慮使用虛函數返回該成員的值,但是不知道您的類和代碼試圖實現什么,很難推薦一種方法或另一種方法。 根據您的小代碼示例,只需使用

Deriv *t = new Deriv(2);

相反,似乎是一個更好的選擇

暫無
暫無

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

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