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++水平有限,如果里面有什么问题的话, 欢迎每一个看到问题的人指出我的问题。