问题
我最近正在学习 C 的虚函数,我知道虚函数是用于子类继承的,但虚函数什么时候才需要用它?因为我发现有的教科书上有用 virtual,有的又不用,我有点搞混了。
回答
下面我解释下 virtual 的必要性。
先来看两个类,
代码语言:javascript复制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."; }
};
接着在主函数中使用,
代码语言:javascript复制Animal *animal = new Animal;
Cat *cat = new Cat;
animal->eat(); // Outputs: "I'm eating generic food."
cat->eat(); // Outputs: "I'm eating a rat."
目前为止看起来都正常。
现在我们再通过函数来调用,
代码语言:javascript复制void func(Animal *xyz) { xyz->eat(); }
主函数中调用,
代码语言:javascript复制Animal *animal = new Animal;
Cat *cat = new Cat;
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating generic food."
这就不对了,明明我传入的是 Cat
类型。难道还需要单独为 Cat
重载 func
函数么?如果以后再加入子类 Dog
呢?
解决方案就是使用 virtual 函数。
代码语言:javascript复制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."; }
};
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating a rat."