C++ 未定义对动态创建 Class 成员函数的引用

C++ Undefined Reference to Function of Dynamically Created Class Member

我有四种不同的 C++ 类; Comp(),其中包含Parent(),其中有两个childrenChildA()ChildB()。我想根据某些参数在 Comp() 内部动态创建 ChildAChildB 的实例。

我的代码看起来有点像这样:

class Parent {
  public:
    foo();
};

class ChildA : public Parent {
  public:
    foo(); // Overrides Parent.foo()
};

class ChildB : public Parent {
  public:
    foo(); // Overrides Parent.foo()
};

class Comp {
  public:
    Init(uint8_t someParam){
      if(someParam){
        obj = new ChildA();
      }
      else{
        obj = new ChildB();
      }
    }

    doFoo(){
        obj->foo();
    }
 
  private:
    Parent* obj;
};

但是,这不会编译。它向我抛出链接器错误,说我有一个未定义的引用 Parent::foo()

/build/libComp.a(Comp.cpp.o): In function `Comp::doFoo()':
Comp.cpp:(.text._ZN6Memory8readByteEt+0x4e): undefined reference to `Parent::foo()'

我觉得我在这里缺少一些基本的东西。我来自 Python 编程背景,所以我还没有完全将我的思维过程切换到 C++。我可以这样使用 类 吗?

作为一名 Python 程序员,您已经习惯了每个方法都是虚拟方法的世界,重载意味着您​​只需替换 dict 中的值。 C++ 有点不同。

所以第一个方案就是定义Parent::foo方法。你已经声明了它,class 不是模板 - 所以你必须在某处定义正文。无论如何,这对您没有帮助,因为调用 obj->foo(); 意味着调用 Parent::foo() 方法,我想这不是您想要的。

现在我们进入虚拟方法的世界:在 C++ 中,您必须将方法显式声明为 virtual

class Parent {
  public:
    virtual foo();
};

你还需要在某处定义 Parent::foo() 的正文。

如果你不想通过设计来定义它,你可以使这个方法抽象(因此class Parent也变得抽象, 并且无法创建此 class 的实例):

class Parent {
  public:
    virtual foo() = 0;
};

您不需要将派生的 classes 的方法 foo 声明为虚拟的(它们无论如何都会是),但最佳做法是添加一个 overridefinal 说明符:

class ChildA : public Parent {
  public:
    foo() final; // Overrides Parent.foo()
};

class ChildB : public Parent {
  public:
    foo() override; // Overrides Parent.foo()
};

区别在于您不能为 ClassA 重写此方法,而您可以为 ClassB.

重写此方法