📅  最后修改于: 2023-12-03 15:11:53.992000             🧑  作者: Mango
在 C++ 中,虚函数是一种允许在子类中重写父类函数的机制。虚函数的使用可以实现多态,即同一个函数在不同情况下表现出不同的行为。
定义一个虚函数需要在函数名前添加关键字 virtual
,例如:
class Animal {
public:
virtual void makeSound() {
std::cout << "Base sound\n";
}
};
class Cat : public Animal {
public:
void makeSound() override {
std::cout << "Meow\n";
}
};
class Dog : public Animal {
public:
void makeSound() override {
std::cout << "Woof\n";
}
};
在上面的代码中,Animal
类有一个虚函数 makeSound()
,它的子类 Cat
和 Dog
均重写了该函数。
注意,派生类函数的函数头必须与基类函数的函数头完全相同,包括返回类型、函数名和参数列表。因此在 C++11 引入了 override
关键字,用以标记函数是否重写了基类中的虚函数,如上述例子中的 makeSound()
。
多态性是指:同一行为在不同情况下具有不同的表现形式,即一个对象具有多种形态。
假设有一个函数 outputSound()
,可以接收 Animal
类型的参数并调用其 makeSound()
函数输出声音。
void outputSound(Animal& animal) {
animal.makeSound();
}
当调用该函数时,若传入一个 Cat
类型的参数,则输出 “Meow”;若传入一个 Dog
类型的参数,则输出 “Woof”。
Cat cat;
Dog dog;
outputSound(cat); // output: Meow
outputSound(dog); // output: Woof
这就是多态。因为同一个函数 outputSound()
在不同的情况下表现出不同的行为。
纯虚函数是一种特殊的虚函数,在它的定义中没有函数体,例如:
class Animal {
public:
virtual void makeSound() = 0;
};
class Cat : public Animal {
public:
void makeSound() override {
std::cout << "Meow\n";
}
};
class Dog : public Animal {
public:
void makeSound() override {
std::cout << "Woof\n";
}
};
在上述代码中,Animal
类中的 makeSound()
函数没有函数体,它成为了一个纯虚函数。任何派生类都必须实现该函数,否则它也会成为抽象类。
虚函数是实现多态的重要机制,它允许子类重写父类函数。纯虚函数是一种特殊的虚函数,没有函数体,任何派生类都必须实现该函数。在使用虚函数时,还要注意虚函数的正确覆盖和多继承问题。