当派生类没有覆盖虚函数时,为什么需要vptr?

use*_*379 8 c++ overriding virtual-functions vptr

class base {
public:
    void virtual fn(int i) {
        cout << "base" << endl;
    }
};

class der : public base{
    public:
    void  fn(char i) {
        cout << "der" << endl;
    }
};

int main() {

    base* p = new der;
    char i = 5;
    p->fn(i);
    cout << sizeof(base);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里定义的函数fn的签名与base类中fn()定义的函数的签名不同,der虽然函数名称相同.因此,der类中定义的base函数隐藏了类函数fn().所以der fn的类版本不能通过调用来p->fn(i)调用; 没事.

我的观点是,为什么sizeof类base或者der是4如果没有用的VTABLE的指针?这里有VTABLE指针的要求是什么?

Alo*_*ave 6

请注意,这是高度依赖于实现的,并且可能因每个编译器而异.

存在的要求vtable是Base类用于继承和扩展,并且从它派生的类可能会覆盖该方法.

Base和Derived这两个类可能驻留在不同的Translation Unit中,编译Base类时编译器也不会真正知道该方法是否会被覆盖.所以,如果找到virtual它生成的关键字vtable.