zoukankan      html  css  js  c++  java
  • 多态性

    回顾区分重载与覆盖?

    1.成员函数被重载的特征:
    (1)相同的范围(在同一个类中);
    (2)函数名字相同;
    (3)参数不同;
    (4)virtual 关键字可有可无。

    2.覆盖是指派生类函数覆盖基类函数,特征是:
    (1)不同的范围(分别位于派生类与基类);
    (2)函数名字相同;
    (3)参数相同;
    (4)基类函数必须有virtual 关键字。

    多态性:

    多态性是面向对象程序设计的重要特征之一。

    简单的说,多态性是指用一个名字定义不同的函数,调用同一个名字的函数,却执行不同的操作,从而实现传说中的”一个接口,多种方法”!

    多态是如何实现绑定的?

    1. 编译时的多态性:通过重载实现
    2. 运行时的多态性:通过虚函数实现

    编译时的多态性特点是运行速度快,运行时的特点是高度灵活和抽象。

    析构函数解析

    虚方法那节告诉大家析构器都是虚方法,有没有表示不解啊? 从一个实例说起:ClsBase.cpp

    #include <iostream>
    
    class ClxBase
    {
    public:
        ClxBase()
        {
        };
    
        virtual ~ClxBase()
        {
        };
    
        virtual void doSomething()
        {
            std::cout << "Do something in class ClxBase!
    ";
        }
    };
    
    class ClxDerived : public ClxBase
    {
    public:
        ClxDerived()
        {
        };
    
        ~ClxDerived()
        {
            std::cout << "Output from the destructor of class ClxDerived!
    ";
        };
    
        void doSomething()
        {
            std::cout << "Do something in class ClxDerived!
    ";
        };
    };
    
    int main()
    {
        ClxBase *pTest = new ClxDerived;
    
        pTest -> doSomething();
    
        delete pTest;
    
        return 0;
    }
    

      结果:

    Do something in class ClxDerived!
    Output from the destructor of class ClxDerived!
    请按任意键继续. . .

    栗子很简单,如果我们把类 ClxBase 析构函数前的 virtual 去掉,那输出结果就应该是: Do something in class ClsDerived! 也就是说类 ClxDerived 的析构函数压根儿没有被调用到!

    #include <iostream>
    
    class ClxBase
    {
    public:
        ClxBase()
        {
        };
    
        ~ClxBase()
        {
        };
    
        virtual void doSomething()
        {
            std::cout << "Do something in class ClxBase!
    ";
        }
    };
    
    class ClxDerived : public ClxBase
    {
    public:
        ClxDerived()
        {
        };
    
        ~ClxDerived()//去掉了virtual 
        {
            std::cout << "Output from the destructor of class ClxDerived!
    ";
        };
    
        void doSomething()
        {
            std::cout << "Do something in class ClxDerived!
    ";
        };
    };
    
    int main()
    {
        ClxBase *pTest = new ClxDerived;
    
        pTest -> doSomething();
    
        delete pTest;
    
        return 0;
    }
    

      结果:

    Do something in class ClxDerived!
    请按任意键继续. . .

    一般下类的析构函数里面都是释放内存资源,而析构函数不被调用的话旧会造成内存泄露。 所以,析构器都是虚方法是为了当一个基类的指针删除一个派生类的对象时,派生类的析构函数可以被正确调用。 另外,当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里边存放着虚函数指针。为了节省资源,只有当一个类被用来作为基类的时候,我们才把析构函数写成虚函数!

  • 相关阅读:
    字符串套餐(更新中)
    洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4
    [AHOI2013]作业
    我的配置
    [HAOI2006]受欢迎的牛
    洛谷P1456Monkey King
    洛谷P2331[SCOI2005]最大子矩阵
    如何更换博客背景
    洛谷P2419 [USACO08JAN]牛大赛Cow Contest
    JS正则表达式验证数字
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/10412710.html
Copyright © 2011-2022 走看看