虚函数
在C++中,virtual
和override
关键字用于支持多态。
virtual 关键字
使用场景
:在基类中声明虚函数目的
:允许派生类重写该函数,实现多态。行为
:当通过基类的指针或引用调用一个虚函数时,调用的是对象实际类的的函数版本
#include <iostream>
using namespace std;
class Vehicle
{
public:
virtual void run(); // 在基类中声明了一个虚函数
void stop();
};
void Vehicle::run()
{
cout << "车跑起来了" << endl;
}
int main()
{
Bike b;
b.run();
return 0;
}
override 关键字
使用场景
:在派生类中重写虚函数目的
:明确指示函数意图重写基类的虚函数行为
:确保派生类的函数确实重写了基类中的一个虚函数。如果没有匹配的虚函数,编译器就会报错。
class Bike : public Vehicle
{
public:
void run() override
{
cout << "脚踩自行车" << endl;
};
};
完整代码如下
#include <iostream>
using namespace std;
class Vehicle
{
public:
string contry;
double price;
Vehicle(){};
virtual ~Vehicle(){};
Vehicle(string contry, double price);
virtual void run(); // 在基类中声明了一个虚函数
void stop();
};
Vehicle::Vehicle(string contry, double price)
{
cout << "基类构造函数被调用" << endl;
this->contry = contry;
this->price = price;
}
void Vehicle::run()
{
cout << "车跑起来了" << endl;
}
class Bike : public Vehicle
{
public:
void run() override
{
cout << "脚踩自行车" << endl;
};
};
int main()
{
Bike b;
b.run();
return 0;
}
注意点
- 只在派生类中使用
overide
: override应仅用于派生类中重写基类的虚函数。 - 虚析构函数:如果类中有虚函数,通常应该将析构函数也声明为虚的析构函数。
- 默认情况下,成员函数不是虚的:在C++中,成员函数默认不是虚函数。只有显示地使用
virtual
关键字才会成为虚函数。 - 继承中的虚函数:一旦在基类中声明为虚函数,该函数在所有派生基类中自动成为虚函数,无论是否使用
virtual
关键字。
正确使用 virtual
和 override
关键字有助于清晰地表达程序员的意图,并利用编译器检查来避免常见的错误,如签名不匹配导致的非预期的函数重写。