概念:
在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。虚函数百度百科
作用:(允许用基类的指针来调用子类的这个函数)实现多态性。
引用自知乎的C++虚函数有什么用
例子:
- 定义两个类,A为动物类,B为猫类(继承A)
- 实现eat方法
- 调用
class Animal {
public:
void eat() {
std::cout << "I'm eating generic food.";
}
};
class Cat:public Animal {
public:
void eat() {
std::cout << "I'm eating a rat.";
}
};
实现完开始调用
int main() {
Animal *animal = new Animal;
animal ->eat();
// 输出: "I'm eating generic food."
Cat *cat = new Cat;
cat -> eat();
// 输出: "I'm eating a rat."
return 0;
};
额外引入一个函数
void func(Animal *a) {
a ->eat();
}
接着在main中调用func
int main() {
Animal *animal = new Animal;
func(animal);
// 输出: "I'm eating generic food."
Cat *cat = new Cat;
func(cat);
// 输出: "I'm eating generic food."
return 0;
};
导致传入cat也输出generic food的是因为func它的参数类型是Animal ,因此,如果要实现cat的eat方法,需要重载函数。
void func(Animal *a){
a -> eat();
}
void func(Cat *b){
b -> eat();
}
若每个动物都重载一遍,太繁琐了。虚函数就可以解决此问题
class Animal {
public :
virtual void eat() {
std::cout << "I'm eating generic food.";
}
};
class Cat : public Animal {
public :
void eat() {
std::cout << "I'm eating a rat.";
}
};
int main() {
void func (Animal * a){
a -> eat();
}
Animal *animal = new Animal;
func(animal);
// 输出: "I'm eating generic food."
Cat *cat = new Cat;
func(cat);
// 输出: "I'm eating a rat.";
};
简单总结一下:
虚函数,允许用基类的指针来调用子类的这个函数。通过虚函数,实现多态。(减少大量不必要的方法重载)