我有以下程序:
#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))?
答案 0 :(得分:5)
把它放到基类:
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; }
};
答案 1 :(得分:2)
对象t
的类型指针指向Base
而Base
未定义data
成员,这就是您的代码无法编译的原因。如果您确定t
指向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
来访问仅由Base*
定义的数据成员,那么您实际上并没有获得任何收益。 Deriv
。
答案 2 :(得分:1)
您已声明指针属于Base
类型且编译器正确,该类中没有成员data
。您需要将指针强制转换为Deriv*
才能以这种方式访问成员。为什么要将类型指针指向基类呢?只有在具有多态类层次结构时,这通常才有用。
您可以考虑使用虚函数来返回此成员的值,但不知道您的类和代码试图实现什么,很难以这种方式推荐。根据您的小代码示例,只需使用
Deriv *t = new Deriv(2);
相反,似乎是一个更好的选择