C ++多态从基类访问派生类字段

时间:2012-12-01 12:46:17

标签: c++ polymorphism

我有以下程序:

#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))?

3 个答案:

答案 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的类型指针指向BaseBase未定义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);
相反,似乎是一个更好的选择