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;
    }
  • 相关阅读:
    UC将发布高性能HTML5游戏引擎XCanvas
    一台晚会3.15拯救不了这些高科技公司
    4G时代更有利于TDD的发展
    【leetcode】Binary Tree Zigzag Level Order Traversal
    四月电商价格战火重燃 服务为决胜之道
    linux sysfs(3)
    ubuntu gedit 中文显示乱码解决方法
    研究人员将Windows Phone 7和Windows Azure推广到平流层的大气污染研究中
    迁移周系列II/II: On Premises 迁移视频
    玩Rock, Paper, Azure Challenge,赢取免费Kinect和Xbox 360!
  • 原文地址:https://www.cnblogs.com/codelu/p/4855057.html
Copyright © 2011-2022 走看看