C++中的关键字之virtual

      在C++中,被virtual所修饰的成员函数就是虚函数。共享的虚类子对象称为虚基类,目的是现以共同的方法,但因个体差异,而采用不同的策略。

#include <iostream>
using namespace std;

class Point{
public:
    virtual void bat() const{
        cout << "1122334455" << endl;
    }
};
class b1:public Point{
    public :
        void bat() const{
            cout << "11" << endl;
        }
};
class b2:public Point{
public :
    void bat() const{
        cout << "22" << endl;
    }
};
class b3:public Point{
public :
    void bat() const{
        cout << "33" << endl;
    }
};
class b4:public Point{
public :
    void bat() const{
        cout << "44" << endl;
    }
};

int main(){
    Point *a[5];
    Point *temp;
    int choose1;
    for(int i=1 ;i<5;i++){
        cout << "请选择1-5:";
        cin >> choose1;
        switch(choose1){
        case 1:
            temp = new b1;
            break;
        case 2:
            temp = new b2;
            break;
        case 3:
            temp = new b3;
            break;
        case 4:
            temp = new b4;
            break;
        default:
            temp = new Point;
            break;
        }
        a[i] = temp;
        temp->bat();
    }
    getchar();
    return 0;
}

由上可知,bat是一个虚基类,但是当子类继承之后,再用子类对象来调用方法会自动判断并调用对象中的方法来输出!

上面的输出结果为:请选择1-5:1
11
请选择1-5:2
22
请选择1-5:3
33
请选择1-5:4
44

定义虚函数的限制:

        (1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。

        (2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。

        (3)当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数。

        (4)如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数

          (5)如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本

          (6)这里有别人讲的,慢慢消化。

           (7)一个函数被说明为虚函数,在派生类中覆盖了该函数,那么该函数也是个虚函数。


你可能感兴趣的:(C++中的关键字之virtual)