C++ 虚函数
C++ 虚函数
虚函数是基类中的成员函数,可以在派生类中被重写。
虚函数是 C++ 中多态性的关键组成部分。它们允许不同的对象对同一个函数调用做出不同的响应。
为什么要使用虚函数?
如果没有 virtual,C++ 会根据指针类型而不是实际对象类型来决定要调用哪个函数。
使用 virtual 时,它会检查指针实际指向的对象。
或者更简单地说:
- 不使用`
virtual`:即使对象来自子类,基类函数也会运行。 - 使用`
virtual`:子类的版本会按预期运行。
不使用虚函数
示例(不使用虚函数关键字)
class Animal {
public:
void sound() {
cout << "Animal sound";
}
};
class Dog : public Animal {
public:
void sound() {
cout << "Dog barks";
}
};
int main() {
Animal* a; // 声明一个指向基类(Animal)的指针
Dog d; // 创建派生类(Dog)的对象
a = &d; // 将基类指针指向 Dog 对象
a->sound(); // 使用指针调用 sound() 函数。由于 sound() 不是虚函数,因此它会调用 Animal 的版本。
return 0;
}
亲自试一试 »
即使 a 指向一个 Dog,它仍然会调用 Animal::sound(),因为该函数不是虚函数。
使用虚函数
示例(使用 virtual 关键字)
class Animal {
public:
virtual void sound() {
cout << "Animal sound";
}
};
class Dog : public Animal {
public:
void sound() override {
cout << "Dog barks";
}
};
int main() {
Animal* a;
Dog d;
a = &d;
a->sound(); // Outputs: Dog barks
return 0;
}
亲自试一试 »
现在可以了!因为 sound() 是 virtual 函数,所以调用时使用的是对象的实际函数,而不仅仅是指针类型。
- 仅在基类中使用
virtual - 为了清晰起见,在派生类中使用
override(可选,但推荐)
C++ 中的 -> 运算符
您可能想知道为什么我们在上面的示例中使用了 ->。
-> 运算符用于通过 指针 访问成员(例如函数或变量)。
它是 (*pointer).member 的简写形式:
Animal* a = new Animal();
a->sound(); // Same as (*a).sound();
提示: 如果您使用的是指向对象的指针,请使用 -> 访问其成员。

