多态性与虚函数

晚捆绑(late binding=动态绑定(dynamic binding)=运行时绑定(runtime binding)

如果一个函数在基类被声明为virtual,那么在所有的派生类中它都是virtual的。在派生类中virtual函数的重定义通常称为重写

纯虚函数禁止对抽象类的函数以值方式调用。这也是防止对象切片(object slicing)的一种方法。通过抽象类,可以保证在向上类型转换期间总是使用指针或引用,如果使用值则总是调用的是基类的实现

构造函数是不能为虚函数的,但析构函数能够且常常必须是虚的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接的影响。但要注意它不知不觉地引入存储泄漏(关闭程序时内在未释放)

删除一个void指针并不调用函数,所以窗口并不负责清除它的对象

#include<iostream>
#include<vector>
using namespace std;

class Rodent{
public:
    virtual void fun()const=0;
    virtual ~Rodent(){}
};

class Mouse:public Rodent{
public:
    ~Mouse(){
        cout << "~Mouse()" << endl;
    }

    void fun()const{
        cout << "M" << endl;
    }
};

class Test:public Mouse{
public:
    void fun()const{
        cout << "Test" << endl;
    }
};

class Gerbil:public Rodent{
public:
    ~Gerbil(){
        cout << "~Gerbil()" << endl;
    }

    void fun()const{
        cout << "G" << endl;
    }
};

class Hamster:public Rodent{
public:
    ~Hamster(){
        cout << "~Hamster()" << endl;
    }

    void fun()const{
        cout << "H" << endl;
    }
};


class BlueHamster:public Hamster{
public:
    void fun()const{
        cout << "B" << endl;
    }
};

void testFun(Rodent * r){
    r->fun();
}

int main(){
    Mouse *m = new Mouse;
    Gerbil *g = new Gerbil;
    Hamster *h = new Hamster;
    vector<Rodent *>v;
    v.push_back(m);
    v.push_back(g);
    v.push_back(h);
    for(int i=0;i<sizeof(v)/sizeof(v[0]);i++){
        v[i]->fun();
        delete v[i];
    }
    Test *test = new Test;
    testFun(test);
}
result:
M
~Mouse()
G
~Gerbil()
H
~Hamster()
Test

你可能感兴趣的:(C++,c,C#)