关于抽象基类中的纯虚函数不能是构造函数、析构函数和赋值运算符的问题
P415
1.抽象基类中的纯虚函数必须要在继承类中被实现,否则该继承类也称为抽象基类;则该继承类就不能创建对象。
2.注意不要将构造函数、析构函数和类的成员重载赋值运算符函数设置为纯虚函数;因为抽象基类中的纯虚函数必须要在继承类中被实现,而这些函数并不能在继承类中被继承(p430)(这些函数在继承类中的名字也都不一样),则继承类也会称为抽象基类,就不能创建对象。
-----------------------------------------2022/4/19-------------------------------------------------
关于基类的纯虚析构函数,派生类可以不覆盖它仍可以创建对象,但是基类中必须实现该纯虚析构函数,因为派生类会隐式的递归调用它
#include <iostream> #include <cstring> #include <string> using namespace std; class base{ int a; public: base(){}; base(int a){this->a = a;} virtual ~base() = 0;//纯虚析构函数 virtual void show(){cout<<a<<endl;cout<<"this is base;"<<endl;}; virtual void f();//不要定义为纯虚析构函数,否则派生类必须覆盖它才能创建对象 }; base::~base() { } void base::f() { cout<<"this is f"<<endl; } class sub:public base { int b; public: sub(){}; sub(int b){this->b = b;} void show(){cout<<b<<endl;cout<<"this is sub"<<endl;} }; int main(void) { sub b(1); b.show();//派生类没有覆盖基类的纯虚析构函数,但仍可以创建对象 }
Q:派生类必须覆盖所有的基类中的纯虚函数;否则该派生类也成为一个抽象基类,不能创建对象;
那么,为什么派生类没有覆盖基类的纯虚析构函数也,该派生类也可以创建对象?