zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    kafka关于修改副本数和分区的数的案例实战(也可用作leader节点均衡案例)
    kafka集群监控之kafka-manager部署(kafka-manager的进程为:ProdServerStart)
    flume配置kafka channle的实战案例
    HTML&CSS基础-表格简介
    HTML&CSS基础-雪碧图的制作和使用
    Hadoop生态圈-使用Ganglia监控flume中间件
    JavaScript基础知识-条件运算符(三元运算符)
    初识Apache Kafka 核心概念
    Hadoop生态圈-CentOs7.5单机部署ClickHouse
    安装Cloudera manager agent步骤详解
  • 原文地址:https://www.cnblogs.com/codelu/p/4855057.html
Copyright © 2011-2022 走看看