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;
}
base
类中定义的函数 fn 的签名不同于 der
类中定义的函数相同的。
因此,der
类中定义的函数隐藏了base
类函数fn()
。所以 der
类的 fn 版本不能被 p->fn(i)
调用;没事。
我的观点是,如果不使用 sizeof
类 base
或 der
是 4
em>VTABLE 指针?这里对VTABLE 指针有什么要求?
最佳答案
请注意,这高度依赖于实现并且可能因每个编译器而异。
存在vtable
的要求是基类用于继承和扩展,从它派生的类可能会覆盖该方法。
Base 和 Derived 这两个类可能驻留在不同的翻译单元中,编译器在编译 Base 类时不会真正知道该方法是否会被覆盖。因此,如果它找到关键字 virtual
,它就会生成 vtable
。
关于c++ - 为什么在派生类不覆盖虚函数时需要 vptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9109662/