[英]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.