zoukankan      html  css  js  c++  java
  • 多态性与虚函数之继承中的virtual 晚捆绑

    一、今天主要谈一下关键字virtual

    我们先来看以下继承:

    enum note {middleC, Csharp, Cflat};
    
    class Instrument{
    public:
        virtual void play(note) const {
            cout<<"Instrument::play"<<endl;
        }
    
        virtual char* what() const {
            return "Instrument";
        }
    
        //Assume this will modify the object:
        virtual void adjust(int) {
        }
    };
    
    class Wind: public Instrument {
    public:
        virtual void play(note) const {//有没有virtual 都一样
            cout<<"Wind::play"<<endl;
        }
        char* what() const {
            return "Wind";
        }
    
        void adjust(int) {}
    };
    
    
    class Brass : public Wind{
    public:
        void play(note) const {
            cout<<"Brass::play"<<endl;
        }
    
        char* what() const {
            return "Brass";
        }
    
        void adjust(int) { }
    };

    我们进行以下测试:

    void tune(Instrument& i)
    {
        i.play(middleC);
    }
    
    
    Wind flute;
    Brass flugelhorn;
    tune(flute);
    tune(flugelhorn);
            

    我们有如下结论:

    在继承中,当基类的成员函数中存在关键字virtual时,在它的子类中相对应的成员函数有没有virtual都有一样的效果!

    二、存放类型信息

    1、不带虚函数的类的长度就是所期望的程度;

    2、带有单个虚函数或者多个虚函数,编译器都智能在这个结构中插入一个单个指针(VPTR)。

    三、虚函数功能

      每当创建一个包含有虚函数的类或从包含有虚函数的类派生出一个类时,编译器就为这个类创建一个唯一的VTABLE。

  • 相关阅读:
    Python的七大数据类型整理
    Linux下获取线程ID tid的方法
    字符串逆序操作
    ftp的两种模式
    exec函数族
    代码行数统计(指定目录下所有文件的Line)
    windows 命令行操作
    C语言时间打印
    Anaconda下载安装说明
    python 使用request进行get post请求
  • 原文地址:https://www.cnblogs.com/wiessharling/p/3089364.html
Copyright © 2011-2022 走看看