【问题标题】:How to access the overidden function of an object of type subclass which is in a vector with a template of class [duplicate]如何访问具有类模板的向量中的子类类型对象的覆盖函数[重复]
【发布时间】: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


【解决方案1】:

您需要将基类函数标记为虚拟。默认情况下,c++ 方法是非虚拟的,因此您的所有 foo() 实例都是完全独立的方法,它们恰好具有相同的名称。

如果您使用的是现代编译器,您还应该使用override 标记您的派生方法,以让编译器检查您是否真的覆盖了基类方法。

您也不能在向量中按值存储对象,您需要存储指针、引用、unique_ptrshared_ptrs。如果在将对象添加到向量时按值存储,它将被复制到 A 类型的新对象中

【讨论】:

  • 谢谢,你一针见血!我必须将 foo 更改为虚函数 更改内容以保存指针而不是对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2021-12-03
  • 2021-11-08
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多