📅  最后修改于: 2023-12-03 14:39:38.745000             🧑  作者: Mango
在C++中,虚函数是一个类成员函数,它可以在派生类中被重写并覆盖基类中的同名函数。虚函数通过动态绑定实现多态性,是面向对象编程中的重要概念。
class Base {
public:
virtual void call() {
std::cout << "Base::call" << std::endl;
}
};
class Derived : public Base {
public:
void call() override {
std::cout << "Derived::call" << std::endl;
}
};
int main() {
Base *obj = new Derived();
obj->call(); // 输出 "Derived::call"
delete obj;
return 0;
}
代码中定义了一个基类 Base
和一个派生类 Derived
,它们都有一个名为 call
的虚函数。在 main
函数中,我们创建了一个 Derived
对象的指针,并将其类型转换为指向 Base
类型的指针。当我们调用 obj->call()
方法时,实际上调用的是 Derived
中的 call
函数,因为 obj
指针指向一个 Derived
类型的对象。
在需要通过指针或引用来使用派生类对象的情况下,我们通常需要在基类中定义一个虚析构函数。虚析构函数是一个在基类中被声明为虚函数的析构函数,它确保在释放派生类对象时调用正确的析构函数。
class Base {
public:
virtual ~Base() {};
};
class Derived : public Base {
public:
~Derived() {};
};
int main() {
Base *obj = new Derived();
delete obj; // 调用 Derived 的析构函数
return 0;
}
在上面的例子中,我们在基类 Base
中声明了一个虚析构函数,然后在派生类 Derived
中定义了自己的析构函数。当我们通过指向 Derived
对象的 Base
指针释放该对象时,系统调用了 Derived
类的析构函数。
有时候,我们需要在基类中定义一个函数,但这个函数在基类中没有实际实现,这种函数称为“纯虚函数”。纯虚函数的声明形式是在函数原型的末尾加上 = 0
,例如:
class Base {
public:
virtual void call() = 0;
};
class Derived : public Base {
public:
void call() override {
std::cout << "Derived::call" << std::endl;
}
};
int main() {
Base *obj = new Derived();
obj->call(); // 输出 "Derived::call"
delete obj;
return 0;
}
在这个例子中,我们将 Base
类的 call
函数定义为纯虚函数,并在派生类 Derived
中实现了它。在 main
函数中,我们创建了一个 Derived
对象的指针,并将其类型转换为指向 Base
类型的指针。当我们调用 obj->call()
方法时,实际上调用的是 Derived
中的 call
函数,因为 obj
指针指向一个 Derived
类型的对象。
虚函数是实现多态性的重要概念,在面向对象编程中起着重要的作用。在使用虚函数时,需要注意虚析构函数和纯虚函数的定义和使用。