我不确定以下代码是否会按照我的预期执行:
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()函数。因为我希望它接受任何可能的派生类型。
编辑:可能重复的答案解释会发生什么,但不解决使用基本版本的函数问题
答案 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*
}