c++中,虚函数和多态是密不可分的。一般来说,通常是通过虚函数来实现多态。
多态:
形式上,使用统一的父类指针做处理,但在实际中,这个指针可能指向的子类对象。看起来是调用父类的方法,但是实际中会调用子类的同名方法。
通过虚函数表能更好的理解虚函数的原理:先说下如何查看虚函数表:选中项目,打开属性,项目的命令行配置中添加: /d1 reportSingleClassLayoutSon,然后重新生成该项目。(点生成可能不行)
想查看其他类的虚函数表只需改最后的类名即可,其他的不需要改。
如:我想查看这个项目中Father类的虚函数表,命令行配置中加/d1 reportSingleClassLayoutFather
即可
#include<iostream>
using namespace std;
class Father {
public:
virtual void func1() { cout << "Father::fun1" << endl; }
virtual void func2() { cout << "Father::fun2" << endl; }
public:
int x = 1;
};
class Mother {
public:
virtual void handle1() { cout << "Mother::handle1" << endl; }
public:
int m = 2;
};
class Son :public Father, public Mother {
public:
void func1() { cout << "Son::func1" << endl; }
void handle1() { cout << "Son::handle1" << endl; }
virtual void func3() { cout << "Son::fun3" << endl; }
};
int main(void)
{
system("pause");
return 0;
}
现有如上代码,代码较简单,就写在一个文件里了。在命令行配置后重新生成的Son类虚函数表如下:
上述代码中的Son类对父类和母类都进行了继承,在Son类中重写了Father中的func1函数,而Father中的func2函数没有被重写,子类中新写了一个fun3函数,故子类继承完Father类的虚函数表如上图前半部分
同理:Son类继承了Mother类,同时重写了hadale1函数,故有如上图后半部分。
在主函数写如下代码并运行结果如下图,
总结:子类的虚函数表构建过程:
1.直接复制父类的虚函数表
2.如果子类重写了父类的某个虚函数
那么就在这个虚函数表中进行相应的替换
3.如果子类增加了新的虚函数,就把这个虚函数添加到虚函数表中(在尾部添加)