代码之家  ›  专栏  ›  技术社区  ›  H. Din

如何访问子类类型对象的overidden函数,该对象位于具有类[重复]模板的向量中

  •  0
  • H. Din  · 技术社区  · 7 年前

    我有一个类a,它定义了一个空函数foo,以及其他一些东西。 两个子类继承自A、AA和AB。这两个子类都以不同的方式重写foo。

    一个单独的类C需要保存子类的不同实例,因此我定义了一个向量,其中包含一个类A的模板。问题是,当我试图通过从C中的vector访问子类来运行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。

    谢谢你的建议!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Alan Birtles    7 年前

    您需要将基类函数标记为虚拟函数。默认情况下,c++方法是非虚拟的,因此 foo() 是完全不同的方法,只是碰巧有相同的名称。

    如果您使用的是现代编译器,那么还应该使用 override 让编译器检查您是否真的重写了基类方法。

    也不能在向量中按值存储对象,需要存储指针、引用、, unique_ptr shared_ptr 而是s。如果在将对象添加到向量时按值存储,则会将其复制到类型为的新对象中 A