C++ 有没有可能通过父类指针调用子类的虚函数
展开全部
1. 虚函数表中应该是有fun_t的吧?
是
2. 有没有什么奇技淫巧绕过编译器的检测,通过父类指针来调用fun_t()呢?
直接转化为子类对象即可:
Son* son = dynamic_cast<Son*>(father);
son->fun_t();
如果father不是一个son的实例,上述代码会抛出std::bad_cast异常。
3. 我们是可以拿到fun()的地址的,那么是否可以通过计算偏移量来拿到fun_t()呢?
你需要知道vtable表中存放fun那个地址项的地址,才可以做推算。但是由于vtable表项中的顺序是编译器决定的,所以这个推算没有什么统一的正确的方法。
实际上,在2中你已经可以调用到fun_t()了,没有必要自己再造一个没有兼容性的轮子。
是
2. 有没有什么奇技淫巧绕过编译器的检测,通过父类指针来调用fun_t()呢?
直接转化为子类对象即可:
Son* son = dynamic_cast<Son*>(father);
son->fun_t();
如果father不是一个son的实例,上述代码会抛出std::bad_cast异常。
3. 我们是可以拿到fun()的地址的,那么是否可以通过计算偏移量来拿到fun_t()呢?
你需要知道vtable表中存放fun那个地址项的地址,才可以做推算。但是由于vtable表项中的顺序是编译器决定的,所以这个推算没有什么统一的正确的方法。
实际上,在2中你已经可以调用到fun_t()了,没有必要自己再造一个没有兼容性的轮子。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询