首页 > 其他分享 >51.虚构函数和纯虚构函数

51.虚构函数和纯虚构函数

时间:2023-02-23 22:47:28浏览次数:40  
标签:函数 虚构 51 纯虚 Animal 基类 抽象类 纯虚析构

1.抽象基类和纯虚函数

  在设计时,常常希望基类仅仅作为其派生类的一个接口。这就是说,仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象。同时创建一个纯虚函数允许接口中放置成员原函数,而不一定要提供一段可能对这个函数毫无意义的代码。

  做到这点,可以在基类中加入至少一个纯虚函数(pure virtual function),使得基类称为抽象类(abstract class).

■ 纯虚函数使用关键字virtual,并在其后面加上=0。如果试图去实例化一个抽象类,编译器则会阻止这种操作。

■当继承一个抽象类的时候,必须实现所有的纯虚函数,否则由抽象类派生的类也是一个抽象类。

■Virtual void fun() = 0;告诉编译器在vtable中为函数保留一个位置,但在这个特定位置不放地址。

2.视频内容

程序1:

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2022年10月19日20:01:43
#include <iostream>
using namespace std;

class Animal
{
public:
    Animal()
    {
        cout << "Animal的构造" << endl;
    }
    ~Animal()
    {
        cout << "Animal的构造" << endl;
    }
};

class Son:public Animal
{
public:
    Son()
    {
        cout << "Son的构造" << endl;
        pName = new char[64];
        memset(pName, 0, 64);
        strcpy(pName, "如花");
    }

    ~Son()
    {
        cout << "Son析构" << endl;
        if( pName != NULL )
        {
            delete[] pName;
            pName = NULL;
        }
    }

public:
    char *pName;
};

void test()
{
    Animal *animal = new Son;
    delete animal;
}

int main()
{
    test();

    system("pause");
    return EXIT_SUCCESS;
}

输出结果:

Animal的构造
Son的构造
Animal的构造
请按任意键继续. . .

程序2:

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2022年10月19日20:01:43
#include <iostream>
using namespace std;

class Animal
{
public:
    Animal()
    {
        cout << "Animal的构造" << endl;
    }
    //虚析构函数会调用子类的析构函数
    //virtual ~Animal()
    //{
    //    cout << "Animal的析构" << endl;
    //}
    //纯虚析构函数,纯虚析构函数需要在类外实现
    virtual ~Animal() = 0;
};

Animal::~Animal()
{
    cout << "Animal的析构" << endl;
}

class Son:public Animal
{
public:
    Son()
    {
        cout << "Son的构造" << endl;
        pName = new char[64];
        memset(pName, 0, 64);
        strcpy(pName, "如花");
    }

    ~Son()
    {
        cout << "Son析构" << endl;
        if( pName != NULL )
        {
            delete[] pName;
            pName = NULL;
        }
    }

public:
    char *pName;
};

void test()
{
    Animal *animal = new Son;
    delete animal;//发生了静态联编
}

int main()
{
    test();

    system("pause");
    return EXIT_SUCCESS;
}

输出结果:

Animal的构造
Son的构造
Son析构
Animal的析构
请按任意键继续. . .

3.虚析构函数和纯虚析构函数(重点)

1.虚析构函数是为了解决基类指针指向派生类对象,并用基类指针释放派生类对象

2.纯虚析构函数,有纯虚析构函数的类是抽象类,不能实例化对象

注意:纯虚析构函数需要在类外实现

3.虚析构函数和纯虚析构函数的区别:

1.有纯虚析构函数的类是抽象类,不能实例化对象,而且要在类外实现

2.虚析构函数不需要在类外实现

参考资料

参考资料来源于黑马程序员等

标签:函数,虚构,51,纯虚,Animal,基类,抽象类,纯虚析构
From: https://www.cnblogs.com/codemagiciant/p/17149726.html

相关文章

  • 54.函数传递参数的三种方式
    #define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;//值传递voidswap(inta,intb){ inttmp=a; a=b; b=tmp;}//指针传递void......
  • 53.cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    1.cin用法1:最基本,也是最常用的用法,输入一个数字:#pragmawarning(disable:4996)#define_CRT_SECURE_NO_WARNINGS1#include<iostream>usingnamespacestd;intmain......
  • 56.函数模板
    1.什么是函数模版  函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板2.怎么编写函数模版//T代......
  • 深入学习jquery源码之jQuery的构造函数与实例化
    深入学习jquery源码之jQuery的构造函数与实例化创建jQuery对象的整个流程如下:1、调用$()方法;2、调用jQuery.prototype.init()构造函数;3、根据选择器不同返回不同的jQuery对......
  • C++主函数参数
    学习C++主函数的参数输入,用于从commandline中读取参数,下面以读取视频文件为例进行说明#include<iostream>#include<fstream>#include<string>#include<opencv2/op......
  • KingbaseES Json 系列四:Json数据操作函数二
    KingbaseESJson系列四--Json数据操作函数二(JSONB_PRETTY,JSONB_STRIP_NULLS,JSON_OBJECTAGG,JSON_EQUAL,JSON_EXISTS,JSON_STRIP_NULLS)JSON数据类型是用来存储JSON(J......
  • KingbaseES Json 系列三:Json数据操作函数一
    KingbaseESJson系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSONB_EXTRACT_PATH_TEXT,JSON_EACH,JSON_EACH_TEXT,JSO......
  • KingbaseES Json 系列二:Json对象函数
    KingbaseESJson系列二--Json对象函数(JSONB_BUILD_OBJECT,JSONB_OBJECT,JSON_BUILD_OBJECT,JSON_OBJECT)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数据......
  • KingbaseES Json 系列一:Json构造函数
    KingbaseESJson系列一--Json构造函数(JSON,ROW_TO_JSON,TO_JSON,TO_JSONB)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数据的。KingbaseES为存储JSON数据......
  • KingbaseES Json 系列十:Json数组构造函数
    KingbaseESJson系列十--Json数组构造函数(ARRAY_TO_JSON,JSONB_BUILD_ARRAY,JSON_ARRAY,JSON_BUILD_ARRAY)JSON数据类型是用来存储JSON(JavaScriptObjectNotation)数......