【发布时间】:2021-12-25 22:13:03
【问题描述】:
我正在尝试创建一个简单的基本抽象类,其中包含一个虚函数和一个定义该虚函数的子类。在编译过程中运行以下会产生错误:
#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)
我的 IDE 建议在 Animal 中为 speak() 添加一个无用的定义,它可以工作:
#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();
}
那么,为什么我必须在基类中定义虚函数?
相比之下,在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();
}
}
【问题讨论】:
-
您不必这样做。您必须通过在声明中添加
= 0来告诉您的编译器它没有实现。 -
虚拟方法可以提供“默认行为”,只有抽象方法会很不方便。
-
否则,在通过指向基类的指针/引用(多态性)进行继承的情况下,它们不会被调用。
-
@tkausl 可以定义/实现纯虚函数。该定义是可选的,而不是被阻止的。
标签: c++ abstract-class virtual-functions function-definition