【发布时间】:2018-09-03 01:26:18
【问题描述】:
我有一个 A 类,它定义了一个空函数 foo 等等。 两个子类继承自 A、AA 和 AB。这两个都以不同的方式覆盖 foo。
一个单独的类 C 需要保存子类的不同实例,所以我定义了一个向量,其中包含一个类 A 的模板。问题是,当我尝试通过从 C 中的向量访问子类来运行 foo 时,它会在 A 中运行 foo 的空版本,而不是来自 AA 或 AB 的覆盖版本。
如何在 C 中拥有一个可以容纳不同子类实例并能够运行覆盖版本的 foo 的向量?
如果您希望查看代码中的类 -
一个
class A
{
public:
A();
foo() {}
};
AA
class AA : public A
{
public:
AA();
foo() { //does something else }
};
AB
class AB : public A
{
public:
AB();
foo() { //does a different something else }
};
C
class C
{
public:
C();
private:
std::vector<A> things;
};
在 C 中,如果我尝试运行 things.at(x).foo(),它会从 A 调用 foo,但我需要从正确的子类调用 foo。
感谢您提供的任何建议!
【问题讨论】:
-
你的意思是正确的?
things[0].foo();哪一个是正确的? -
我的意思是
things应该包含 AA 和 AB 的混合实例,因此 foo 的覆盖版本将从该类调用,无论它可能是什么,而是从一个 -
基类的向量,这总是引发是否发生切片/截断的问题。您是否遵循一般准则并禁用分配和复制?
标签: c++ class inheritance subclass