c++ - 为什么在派生类不覆盖虚函数时需要 vptr?

标签 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;
}

base 类中定义的函数 fn 的签名不同于 der 类中定义的函数相同的。 因此,der 类中定义的函数隐藏了base 类函数fn()。所以 der 类的 fn 版本不能被 p->fn(i) 调用;没事。

我的观点是,如果不使用 sizeofbaseder4 em>VTABLE 指针?这里对VTABLE 指针有什么要求?

最佳答案

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

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

Base 和 Derived 这两个类可能驻留在不同的翻译单元中,编译器在编译 Base 类时不会真正知道该方法是否会被覆盖。因此,如果它找到关键字 virtual,它就会生成 vtable

关于c++ - 为什么在派生类不覆盖虚函数时需要 vptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9109662/

相关文章:

node.js - 如何在不接受 Atlassian 设计指南许可的情况下使用 npm 包的替代实现来使用 Atlaskit

c++ - 为 STL 排序算法定义 < - 运算符重载、仿函数或独立函数?

c++ - 包含另一个关键部分的关键部分?

c++ - 使用两种方法覆盖 << 运算符

c++ - 具有自动存储持续时间的虚拟功能似乎不起作用

C++ 使用函数指针重写纯虚函数

c++ - 基类函数成员在派生类对象上执行只有一种情况

c++ - 使用 INSTANTIATE_TEST_CASE_P 的同一 Fixture 的不同实例

c++ - WinSock2.h 编译错误

lua:如何让 getmetatable() 返回 nil?