C++ 纯虚函数
程序员文章站
2023-12-31 21:42:34
...
虚函数
在基类中将一个函数声明为虚函数,使该函数具有虚属性,那么其所有派生函数中该函数的重写都具备了虚属性,也就使得基类指针可以调用派生类实例中继承自该基类的所有成员函数,且若有重写,调用的都是重写后的函数。
纯虚函数
声明纯虚函数可使当前类变成抽象类,禁止该类被实例化,并要求其非抽象类的派生类必须实现该函数。
下面展示虚函数和纯虚函数的代码示例,注意观察注释内容:
class Base
{
public:
virtual void print() = 0;//纯虚函数,可以有函数体,可实例化的派生类必须重写它
virtual void play() {//虚函数,有函数体,若派生类没有重写它,就原样继承下来
cout << "Base play!" << endl;
}
virtual ~Base() = 0;//纯虚析构函数,必须要有函数体
//virtual ~Base(){} //很多情况下,基类的虚函数都会有函数体,将析构函数声明为纯虚函数是一种抽象化基类、不许其实例化的一种方法。
};
void Base::print() {
//被声明为纯虚函数,仍可以有函数体
//但派生类若想实例化,必须重写纯虚函数,派生类中可以调用基类有函数体的纯虚函数(Base::print())
cout << "Base print!" << endl;
}
Base::~Base(){
//被声明为纯虚析构函数,根据C++类的规则,因为其派生类析构函数会调用基类的析构函数,所以必须有函数体,否则不知道你执行了啥
}
1、纯虚函数对类最大的束缚就是:类中一旦出现纯虚函数,就不可实例化了;
2、纯虚函数还是可以有函数体,只不过最终还是要被派生类重写,在派生类的函数中可以调用基类中有函数体的纯虚函数;
3、为使派生类能完全释放资源,基类析构函数必须声明为虚函数,否则,在用基类指针new一个派生类对象后,delete该指针就只能回收与基类相关的资源,造成内存泄漏;
4、纯虚析构函数必须要有函数体,根据C++析构函数的调用规则,派生类会调用基类析构函数,如果基类析构函数没有函数体会造成函数调用失败而报错,这是纯虚析构函数与普通纯虚函数不同之处。