【发布时间】:2018-11-09 19:18:41
【问题描述】:
我最近在阅读有关 C++ 中的虚函数和继承的内容,最后读到了 vptr 和 VTABLE。
我的问题与使用 vprt 调用派生对象的方法有关。
我解释一下,下面是我的代码:
#include <iostream>
using namespace std;
class base
{
public:
void fun_1() { cout << "base-1\n"; }
virtual void fun_2() { cout << "base-2\n"; }
virtual void fun_3() { cout << "base-3\n"; }
virtual void fun_4() { cout << "base-4\n"; }
};
class derived : public base
{
public:
void fun_1() { cout << "derived-1\n"; }
void fun_2() { cout << "derived-2\n"; }
void fun_4() { cout << "derived-4\n"; }
};
int main()
{
base *p;
derived obj1;
p = &obj1;
void(*firstfunc)() = (void(*)(void))(*(int*)*(int*)p);
firstfunc();
}
结果是:
派生-2
好的,到现在为止,我对(void(*)(void))(*(int*)*(int*)p)的操作还是很模糊,但是我怎么能调用第二个函数呢?
谢谢
【问题讨论】:
-
你是从哪里想到写
void(*firstfunc)() = (void(*)(void))(*(int*)*(int*)p);的?你期望它做什么? -
Vtables 和 vptrs 是内部实现细节,此代码取决于未定义的行为。
-
不需要(实际上也没有保证支持)访问任何
vtable;只需执行p->fun_1()或p->fun_2();该语言会为您处理动态绑定。 -
@Blood-HaZaRd 从该页面:许多编译器将虚拟表指针作为对象的最后一个成员;其他编译器将其作为第一个
-
如果你认为你需要关心这些东西的内部结构,那就停下来。你这样做是错的。虽然了解事物是如何“在幕后”实现的可能很有用,但作为语言的用户,您永远不需要知道或关心。
标签: c++ polymorphism virtual