为什么派生类虚函数可以调用基类虚函数?编译器如何实现?

时间:2012-07-11 06:40:37

标签: c++

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()函数地址存储在哪里?

3 个答案:

答案 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)

不使用v-table就调用

base_class::v_func1(),就像任何非虚函数一样。

答案 2 :(得分:1)

编译器只知道所有类的所有虚拟表的地址。这就是问“编译器如何在构造函数中设置VMT”?存储在VMT中的函数的地址只是函数,它们以完全相同的方式为编译器所知。