首页 > 编程语言 >c++“二纯” 纯虚函数和纯虚析构

c++“二纯” 纯虚函数和纯虚析构

时间:2024-06-06 23:33:32浏览次数:18  
标签:调用 函数 二纯 定义 纯虚 析构 基类 纯虚析构

首先给出这样一段概念:

在C++中,当基类包含纯虚函数时,这些纯虚函数在基类中不需要(也不能)有定义。但是,如果基类有一个纯虚析构函数(即析构函数被声明为纯虚函数),那么情况就有些特殊了。纯虚析构函数需要在基类中有声明,但通常也需要在类外提供一个定义(尽管这个定义通常只包含析构函数的空体)。

再通过一段代码更加深入的理解:
#include <iostream>  
  
// 基类  
class Base {  
public:  
    // 纯虚析构函数  
    virtual ~Base() = 0 {  
        // 注意:在C++11及之前的标准中,纯虚析构函数不能提供实现体  
        // 但在C++11中开始,纯虚析构函数可以在类定义内部有定义体(作为内联成员函数)  
        // 但在大多数情况下,我们仍然选择将其定义在类定义之外  
        std::cout << "Base destructor called." << std::endl;  
    }  
  
    // 纯虚函数  
    virtual void pureVirtualFunction() = 0;  
  
    // 其他成员函数  
    void normalFunction() {  
        std::cout << "Base normal function called." << std::endl;  
    }  
};  
  
// 在类定义外部定义纯虚析构函数(如果需要)  
Base::~Base() {  
    // 注意:这个定义是可选的,并且如果在类定义内部已经提供了定义体,则不需要这里再定义  
}  
  
// 派生类  
class Derived : public Base {  
public:  
    ~Derived() override {  
        std::cout << "Derived destructor called." << std::endl;  
    }  
  
    // 提供纯虚函数的实现  
    void pureVirtualFunction() override {  
        std::cout << "Derived pure virtual function called." << std::endl;  
    }  
};  
  
int main() {  
    // 由于Base是抽象类,不能直接实例化  
    // Base* base = new Base(); // 错误  
  
    // 创建派生类对象并通过基类指针管理  
    Base* basePtr = new Derived();  
  
    // 调用派生类的纯虚函数  
    basePtr->pureVirtualFunction();  
  
    // 调用基类的普通函数  
    basePtr->normalFunction();  
  
    // 删除对象,会先调用派生类的析构函数,再调用基类的析构函数  
    delete basePtr;  
  
    return 0;  
}
总结:
  1. 在C++11及之后的版本中,纯虚析构函数可以在类定义内部直接提供定义体(作为内联成员函数)。但在C++11之前,纯虚析构函数不能在类定义内部提供定义体,它必须在类定义外部定义。

  2. 在这个例子中,Base 类是一个抽象类,因为它包含了一个纯虚函数 pureVirtualFunction()。因此,你不能直接实例化 Base 类的对象。

  3. 当你通过基类指针 basePtr 调用 delete 时,会首先调用派生类 Derived 的析构函数,然后再调用基类 Base 的析构函数。这是因为 Derived 类的析构函数是通过 override 关键字明确指定的,它会先执行自己的清理工作,然后隐式地调用基类的析构函数。如果基类没有纯虚析构函数,并且你试图通过基类指针删除派生类对象,那么只有基类的析构函数会被调用,这可能会导致资源泄漏。

纯虚析构函数的主要目的是确保通过基类指针或引用删除派生类对象时,派生类的析构函数也能被正确调用

标签:调用,函数,二纯,定义,纯虚,析构,基类,纯虚析构
From: https://blog.csdn.net/2302_80272644/article/details/139511973

相关文章

  • C++ 虚函数与纯虚函数
    C++中的虚函数(virtual)是可以被子类重写的成员函数而纯虚函数(purevirtual)是必须被抽象/基类中的定义的虚函数,必须被派生类实现virtualtypefunction(){}//虚函数virtualvoidfuntion1()=0//纯虚函数主要区别:实现虚函数有实现,而纯虚函数没有实现子类中虚函数可......
  • 纯虚函数与抽象类
    当类中有了纯虚函数,这个类也就是抽象类,抽象类的特点:  无法实例化对象  子类必须重写抽象类中的纯虚函数,否则也属于抽象类 纯虚函数语法:  virtual返回值类型函数名(参数列表)=0 #include<iostream>classAbstractDrink{public://煮水v......
  • C++ 纯虚函数
    纯虚函数优点防止派生类忘记实现虚函数,纯虚函数使得派生类必须实现基类的虚函数。在某些场景下,创建基类对象是不合理的,含有纯虚拟函数的类称为抽象类,它不能直接生成对象。声明方法:在基类中纯虚函数的方法的后面加=0。virtualvoidfuntion()=0;virtualstd::stringGetN......
  • C++纯虚函数和抽象类
    在C++中,可以将虚函数声明为纯虚函数,语法格式为:virtual返回值类型函数名(函数参数)=0;纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。包含纯虚函数的类称......
  • UVM - 2 (补充虚基类及纯虚函数知识点)
    虚方法和纯虚方法虚方法定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。virtualfunction纯虚方法定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范......
  • C++(虚函数和纯虚函数的区别)
    在C++中,虚函数和纯虚函数都与面向对象编程中的多态性相关,但它们有一些关键的区别。虚函数(VirtualFunction):定义:虚函数是在基类中声明并在派生类中定义的函数,使用virtual关键字进行声明。在基类中可以提供一个默认实现,但在派生类中可以选择覆盖(override)它。实现:虚函数可......
  • C++中的虚函数和纯虚函数详细讲解
    1.虚函数1.1概念(1)定义一个函数为虚函数,不代表函数为不被实现的函数。(2)定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。1.2简介假设我们有下面的类层次classA{public:virtualvoidfoo(){cout<<"A::foo()iscalled"<<endl;}};c......
  • C++的纯虚函数和抽象类
    在C++中,可以将虚函数声明为纯虚函数,语法格式为:virtual返回值类型函数名(函数参数)=0;纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。包含纯虚函数的类称为抽......
  • C++_19_虚函数、纯虚函数和抽象类 - 重写版
    虚(成员)函数:在C++中,只有类中的成员函数能被声明为虚函数,顶层函数则不能被声明为虚函数;并且如果在类内声明类外定义,则只在类内声明时加virtual声明虚函数是为了构成多态,多态需要继承关系,需要在类中声明;虚函数能被继承:基类被声明为虚函数,那么派生类即便未添......
  • 纯虚函数
    首先记录下虚函数必须是非静态成员函数,访问权限是public和protected。纯虚函数在虚表中的值为0,带有纯虚函数的类为抽象类,不能实例化。抽象类的作用:在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。......