一、今天主要谈一下关键字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。