我有一个A类,它定义了一个空函数foo等等。 两个子类继承自A,AA和AB。这两个都以不同的方式覆盖了foo。
一个单独的类C需要包含子类的不同实例,因此我在其中定义了一个带有A类模板的向量。问题是,当我尝试通过从C中的向量访问子类来运行foo时,它在A中运行空的foo版本,而不是从AA或AB中重写的版本。
如何在C中有一个向量,它可以包含子类的不同实例,并且能够运行被覆盖的foo版本?
如果您希望在代码中看到这些类 -
A
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。
感谢您提供任何建议!
答案 0 :(得分:1)
您需要将基类功能标记为虚拟。默认情况下,c ++方法是非虚拟的,因此foo()
的所有实例都是完全独立的方法,恰好具有相同的名称。
如果您使用的是现代编译器,则还应使用override
标记派生方法,以便编译器检查您是否真的覆盖了基类方法。
您也无法按向量中的值存储对象,而是需要存储指针,引用,unique_ptr
或shared_ptr
。如果在向向量添加对象时按值存储,则会将其复制到A