virtual void dev_class::v_func1()
{
base_class::v_func1();
cout << "This is dev_class's v_func1()" << endl;
}
在dev_class
的v-table中,base_class::v_func1()
已被dev_class::v_func1()
覆盖。那么,为什么dev_class::v_func1()
可以调用base_class::v_func1()
? base_class::v_func1()
函数地址存储在哪里?
答案 0 :(得分:3)
在调用中使用限定函数名时,将直接调用指定函数,而不使用任何“v-tables”。这适用于从派生类成员函数调用基类成员函数(如在您的示例中)。这适用于所有其他上下文中的成员函数调用。
例如
base_class *p = new dev_class;
p->v_func1(); // virtual call - calls `dev_class::v_func1`
p->base_class::v_func1(); // non-virtual call - calls `base_class::v_func1`
合格的函数名称可以抑制和覆盖虚拟调度机制,并有效地将虚拟成员函数调用转换为普通的成员函数调用。
答案 1 :(得分:2)
base_class::v_func1()
,就像任何非虚函数一样。
答案 2 :(得分:1)
编译器只知道所有类的所有虚拟表的地址。这就是问“编译器如何在构造函数中设置VMT”?存储在VMT中的函数的地址只是函数,它们以完全相同的方式为编译器所知。