虚函数
虚函数在C++中用于实现多态,它允许子类重写父类的方法。当通过父类指针或引用调用一个虚函数时,会根据对象的实际类型来调用对应的函数,这就是多态的体现。以下是一个简单的示例代码,展示了虚函数的基本用法:
#include <iostream>
// 基类
class Base {
public:
// 声明一个虚函数
virtual void show() {
std::cout << "Base class show function called." << std::endl;
}
// 虚析构函数,确保删除派生类对象时,可以调用派生类的析构函数
virtual ~Base() {}
};
// 派生类
class Derived : public Base {
public:
// 重写基类的虚函数
void show() override {
std::cout << "Derived class show function called." << std::endl;
}
};
int main() {
Base* basePtr;
Derived derivedObj;
// 指向派生类的基类指针
basePtr = &derivedObj;
// 调用虚函数,将会调用派生类中的实现
basePtr->show();
return 0;
}
在这个示例中:
- 我们定义了一个基类
Base
,它有一个虚函数show()
和一个虚析构函数~Base()
。 - 然后定义了一个派生类
Derived
,它重写了基类的虚函数show()
。 - 在
main
函数中,我们创建了一个Derived
类的对象derivedObj
,并通过基类指针basePtr
指向它。 - 调用
basePtr->show()
时,虽然basePtr
是基类Base
的指针,但是因为show()
是虚函数,所以实际调用的是Derived
类中的show()
函数,这就实现了多态。
通过这个示例,你可以看到虚函数如何允许在运行时根据对象的实际类型调用相应的函数。这是实现接口和抽象类在C++中非常重要的特性之一。
用一个更简单易懂的例子来解释虚函数的作用吧!
想象我们在做一个动物园的软件,我们想让每种动物发出自己的叫声。在C++中,我们可以使用虚函数来实现这一点,这样不同的动物就可以有不同的实现方式了。
首先,我们定义一个Animal
基类,它有一个虚函数makeSound
,这个函数用来输出动物的叫声。然后,我们定义两个派生类:Dog
和Cat
,它们分别重写makeSound
函数,以输出各自的叫声。
这里是完整的示例代码:
#include <iostream>
using namespace std;
// 基类 Animal
class Animal {
public:
// 定义虚函数 makeSound
virtual void makeSound() {
cout << "Some animal sound" << endl;
}
};
// 派生类 Dog
class Dog : public Animal {
public:
// 重写 makeSound 函数
void makeSound() override {
cout << "Woof!" << endl;
}
};
// 派生类 Cat
class Cat : public Animal {
public:
// 重写 makeSound 函数
void makeSound() override {
cout << "Meow!" << endl;
}
};
int main() {
Animal* myAnimal;
Dog myDog;
Cat myCat;
// 指针指向 Dog 对象
myAnimal = &myDog;
myAnimal->makeSound(); // 输出: Woof!
// 指针指向 Cat 对象
myAnimal = &myCat;
myAnimal->makeSound(); // 输出: Meow!
return 0;
}
在这个例子中,Animal
类定义了一个虚函数makeSound
,它有一个默认实现(输出"Some animal sound")。Dog
和Cat
类继承了Animal
类,并分别提供了它们自己的makeSound
实现。在main
函数中,我们创建了一个Animal
类型的指针,然后分别将它指向Dog
和Cat
对象并调用makeSound
方法。因为makeSound
是一个虚函数,所以实际调用的是指针所指对象的类型的makeSound
方法,这就实现了多态。