在继承时,使用指向派生类的指针覆盖指向基类的指针

时间:2017-11-07 15:09:11

标签: c++

我不确定以下代码是否会按照我的预期执行:

struct Foo
{
    // Some variables
};

struct Bar : public Foo
{
    // Some more variables
};

struct Baz : public Foo
{
    // Some more variables
};

class ExampleBase
{
    Foo* A;
    int B;
    double C;
};

class ExampleBar : public ExampleBase
{
    Bar* A;
}

class ExampleBaz : public ExampleBase
{
    Baz* A;
}

void DoStuff(ExampleBase& example)
{
    // Does things with the Foo*, doesn't need to know what inherited type it is
}

当指针(A)具有相同的名称时会发生什么,该指针派生自同一个类,但在派生的Example类中重新定义?

我试过模仿这样的示例类,以避免任何歧义:

template <typename T>
class ExampleBase
{
    T* A;
    int B;
    double C;
}

然后不从中派生任何类。但是,当我这样做时,我无法编译DoStuff()函数。因为我希望它接受任何可能的派生类型。

编辑:可能重复的答案解释会发生什么,但不解决使用基本版本的函数问题

1 个答案:

答案 0 :(得分:0)

您可能希望使用模板来实施DoStuff

template<typename T>
void DoStuff(ExampleBase<T>& example)
{
    // Does things with the T*
}

或者,您可以单独公开模板和多态接口:

struct ExampleBase
{
    int B;
    double C;
    virtual Foo* getA();
};

template<typename T>
struct ExampleTBase : ExampleBase
{
    T* A;

    Foo* getA() override { return A; }
};

void DoStuff(ExampleBase& example)
{
    // Does things with the getA(), that returns a Foo*
}