为什么必须在基类中定义虚函数?

kan*_*ndi 2 c++ abstract-class virtual-functions function-definition

我正在尝试创建一个带有虚函数的简单基抽象类和一个定义该虚函数的子类。运行以下命令会在编译期间产生错误:

#include <iostream>
using namespace std;

class Animal {
public:
    virtual void speak();

};

class Cat : public Animal{
public:
    void speak() override {
        cout << "Meow!";
    }
};

int main() {
    Cat cat;
    Animal* base = &cat;
    base->speak();
}
// error LNK2001: unresolved external symbol "public: virtual void __thiscall Base::speak(void)" (?speak@Base@@UAEXXZ)
Run Code Online (Sandbox Code Playgroud)

我的 IDE 建议为 Animal 中的 talk() 添加一个无用的定义,并且它有效:

#include <iostream>
using namespace std;

class Animal {
public:
    virtual void speak();
};

void Animal::speak() {

}

class Cat : public Animal{
public:
    void speak() override {
        cout << "Meow!";
    }
};

int main() {
    Cat cat;
    Animal* base = &cat;
    base->speak();
}
Run Code Online (Sandbox Code Playgroud)

那么,为什么我必须在基类中定义虚函数呢?

相比之下,在 Java 中没有这样的需要,甚至没有可能性(这更有意义):

abstract class Animal {
    abstract void speak();
}

class Cat extends Animal {
    void speak() {
        System.out.println("Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.speak();
    }
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

是的,应该定义非纯虚函数。

[类.虚拟]/12 :

类中声明的虚函数应在该类中定义或声明为纯函数([class.abstract]),或两者兼而有之;不需要诊断([basic.def.odr])。

您可以提供定义,或将其标记为纯虚拟。

class Animal {
public:
    virtual void speak() = 0;
};
Run Code Online (Sandbox Code Playgroud)