将基类指针强制转换为子类指针后的疑惑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将基类指针强制转换为子类指针后的疑惑相关的知识,希望对你有一定的参考价值。

#include <iostream>

using namespace std;

class A
public:
virtual void fun0()
cout << "A::fun0 (virtual)" << endl;

void fun1()
cout << "A::fun1" << endl;

void fun2()
cout << "A::fun2" << endl;


;
class B : public A
public:

void fun0()
cout << "B::fun0 (virtual)" << endl;

void fun1()
cout << "B::fun1" << endl;

void fun3()
cout << "B::fun3" << endl;


;

int main()
A *pa=new A;
B *pb=(B*)pa; //想请教一下这一步,编译器具体做了些什么工作??

pb->fun0();
pb->fun1();
pb->fun2();
pb->fun3();

return 0;


以下是打印结果
A::fun0 (virtual)
B::fun1
A::fun2
B::fun3

问题是:经过强制转换后,pb调用的虚拟函数表应该是类A的,但调用函数的话则是可以调用类B的,不知道如何解释这种现象?

因为虚函数表指针是保存在类的实例中的,每个实例都有一个虚函数表指针,而一般的方法则和类的实例无关,函数表指针不保存在实例中,即使没有生成类的实例,一般方法的函数表仍然存在。 参考技术A 调用类A的函数fun0是虚函数,调用类B的函数fun1不是虚函数。

以上是关于将基类指针强制转换为子类指针后的疑惑的主要内容,如果未能解决你的问题,请参考以下文章

向上强制转换和向下强制转换

为啥可以从指向实例化基类对象的强制转换指针调用非静态派生类方法?

父子类上下强制转换访问权限问题

crfoJkvKsm

C#:将基类转换为子类

父类子类指针相互转换问题