• C++学习笔记6——类的多态


    简介:

      同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

    虚函数:

      在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。

    class Base
    {
    public:
        virtual void print(void)
        {
        //...
        }
    };
    
    class Derived : public Base
    {
    public:
        virtual void print(void)
        {
        //...         
        }
    };   

    PS:

      1、当类中声明虚函数时,编译器会在类中生成一个虚函数表。

      2、虚函数表是一个存储类成员函数指针的数据结构。

      3、虚函数表是由编译器自动生成与维护的。

      4、virtual成员函数会被编译器放入虚函数表中。

      5、当存在虚函数时,每个对象中都有一个指向虚函数表的vfptr指针。

      6、vfptr指针一般作为类对象的第一个成员 。

      7、使用VS开发人员命令提示可以查看内存布局和虚函数表。

    cl /d1 reportSingleClassLayout类名 CPP文件名 

    纯虚函数:

      纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。起到定义接口的作用。

    class Base
    {
    public:
        virtual void print(void) = 0;
    };

    虚析构函数:

      通过基类指针析构所以派生类的资源。如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针只会释放基类申请的内存。

    class Base
    {
    public:    
        virtual ~Base()
        {
        }
    };

    Demo:

    #include <iostream>
    using namespace std;
    
    class Base
    {
    public:
        Base()
        {
            cout << "Base构造函数" << endl;
        }
        virtual ~Base()
        {
            cout << "Base析构函数" << endl;
        }
        virtual void print(void)
        {
            cout << "Base" << endl;
        }
    };
    
    class Derived : public Base
    {
    public:
        Derived()
        {
            cout << "Derived构造函数" << endl;
        }
        ~Derived()
        {
            cout << "~Derived析构函数" << endl;
        }
        virtual void print(void)
        {
            cout << "Derived" << endl;
        }
    };
    
    void show(Base *pb)
    {
        pb->print();
    }
    
    int main()
    {
        Base *pb = new Base;
        show(pb);                //输出Base
        delete pb;
    
        Base *pd = new Derived;
        show(pd);                //输出Derived
        delete pd;
        system("pause");
        return 0;
    }
  • 相关阅读:
    java注解说明
    paypal
    eclispe查看jdk源码后特别卡顿导致未响应解决
    ubuntu+tomcat,多环境、自动化部署脚本,git+maven+tomcat+ubuntu
    ubuntu+let's encrypt生成永久免费https证书 ubuntu+tomcat+nginx+let's encrypt
    MySQL创建数据库与创建用户以及授权
    linux查找并杀死进程shell
    redmine安装笔记
    C#动态获取本机可用串口的两种方式
    C# 控件缩写规范
  • 原文地址:https://www.cnblogs.com/codelu/p/4855057.html
Copyright © 2020-2023  润新知