C++ 关于virtual

来源:互联网 发布:淘宝2016年交易规模 编辑:程序博客网 时间:2024/06/01 11:53

C++ 关于virtual

virtual的意义

C++代码里经常可以看到一些基类里的一些函数被定义为virtual,它的意义是什么呢?如果一个基类里的函数被定义为虚函数,就代表这个函数,在继承的时候希望派生类对其进行重写。
在书上看到了这些知识点之后,我做了这么一个测试,如下:

#include <iostream>using namespace std;class MyClass{public:    int b = 100;    int get() {        return b;    }};class Aaa :public MyClass{public:    int a = 10;    int get() {        return a;    }};int main(void){    Aaa aaa;    MyClass bbb;    cout << bbb.get() << endl;    cout << aaa.get() << endl;    getchar();}

运行结果是 100
10

然后如果我们给基类的get方法加上virtual修饰,如下:

class MyClass{public:    int b = 100;    virtual int get() {        return b;    }};

这个时候我们会发现一个问题,加不加virtual没有什么差别。
加不加virtual有差别吗?virtual在c++里面存在的意义是什么?

动态绑定

首先这里我们做这样一个测试,关于类的一些定义和声明都不做改动,但是把main改成如下:

void test(MyClass& a) {    cout << a.get() << endl;}int main(void){    Aaa aaa;    MyClass bbb;    test(aaa);    test(bbb);    getchar();}

这个时候结果是 10
100
如果这个时候我们把基类里面的virtual声明去掉,这个时候结果会变成100 100
为什么会这样呢?这里就要引出一个C++里面的概念,叫动态绑定。

当C++中的基类指针或者引用调用虚函数的时候,就会发生动态绑定,此时调用的函数取决于指针以及引用实际指向的类(基类,及其各种派生类)中定义的方法。这里如果不把函数声明成虚函数的话就不会发生动态绑定,也就是说执行的方法全部为基类定义的方法。

到这里virtual的意义,我也就有了初步的一些理解,我的C++水平有限,如果里面有什么问题的话, 欢迎每一个看到问题的人指出我的问题。

0 0