虚函数对于dynamic_cast转换的作用:
为何使用dynamic_cast转换类指针时,需要虚函数呢?
Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。
如何在运行时获取到这个信息——虚函数表。
C++对象模型中,对象实例最前面的就是虚函数表指针,
通过这个指针可以获取到该类对象的所有虚函数,包括父类的。
因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。
所以虚函数对于正确的基类指针转换为子类指针是非常重要的。
例子:
#include<iostream>
#include<typeinfo>
using namespace std;
class A {
virtual void process() {} //必须要用虚函数,不然会出现多态的错误
public:
void myPrint() {
cout << "A myPrint is run" << endl;
}
};
class B :public A {
void size() {}
public:
void process() {
cout << "B process is run" << endl;
}
void myPrint() {
cout << "B myPrint is run" << endl;
}
};
int main() {
cout << "测试, 基类转派生类dynamic_cast test1:" << endl;
A* a1 = new A();
B *b1 = dynamic_cast<B*>(a1);//fail
if (b1 == nullptr) {
cout << "b1 is null" << endl;
}
cout << "测试, 派生类转派生类dynamic_cast test2:" << endl;
A* a2 = new B;
B *b2 = dynamic_cast<B*>(a2);//ok
if (b2 == nullptr) {
cout << "b2 is null" << endl;
}
else {
b2->myPrint();
}
B bb;
A& a3 = bb;
B& b3 = dynamic_cast<B&> (a3);
b3.process();//ok
try {
A aa;
A& a4 = aa;
B& b4 = dynamic_cast<B&>(a4);
b4.process();//fail
}
catch (bad_cast &c) {
cout << "bad cast" << endl;
}
cout << "测试, 派生类转基类dynamic_cast test5:" << endl;
B* b5 = new B;
A* a5 = dynamic_cast<A*>(b5);//ok
if (a5 == nullptr) {
cout << "a5 is null" << endl;
}
else {
a5->myPrint();
}
system("pause");
return 0;
}