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

4

3 回答 3

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`

限定函数名抑制和覆盖虚拟调度机制,有效地将虚拟成员函数调用转换为普通成员函数调用。

于 2012-07-11T07:06:49.167 回答
2

base_class::v_func1()调用时不使用 v-table,就像任何非虚函数一样。

于 2012-07-11T06:44:13.040 回答
1

编译器只知道所有类的所有虚拟表的地址。这和问“编译器如何在构造函数中设置VMT”是一样的?存储在 VMT 中的函数地址只是简单的函数,编译器以几乎相同的方式知道它们。

于 2012-07-11T06:43:54.803 回答