关于抽象基类中的纯虚函数不能是构造函数、析构函数和赋值运算符的问题

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:派生类必须覆盖所有的基类中的纯虚函数;否则该派生类也成为一个抽象基类,不能创建对象;

那么,为什么派生类没有覆盖基类的纯虚析构函数也,该派生类也可以创建对象?

posted @ 2022-04-16 22:15  SanFranciscoo  阅读(86)  评论(0编辑  收藏  举报