【问题标题】:does pointer "this" in c++ support virtual mechanism?c++ 中的指针“this”是否支持虚拟机制?
【发布时间】:2020-12-22 06:22:55
【问题描述】:

考虑一下:

class B {
    void f() { vf(); };
    virtual void vf();
};

class D: public B{
    virtual void vf();
};

我认为在 C++ 中,B::f() 的实现是这样的:

f(B *this) {
    *(this->vptr[index])(this);
}

下例中D::vf()是通过虚拟机制调用的吗?

B *p = new D();
p->f(); 

【问题讨论】:

标签: c++ virtual-functions vtable dynamic-dispatch vptr


【解决方案1】:

对于给定的示例,答案是肯定的,但对于来自基类的构造函数的调用则不是,它在派生类被构造之前执行。

稍作修改的例子:

#include <iostream>

class B {
public:
    B() { f(); }

    void f() { vf(); };
    virtual void vf()  { std::cout << "B::vf" << std::endl; }
};

class D: public B{
    void vf() override { std::cout << "D::vf" << std::endl; }
};

int main()
{
    B *p = new D();  // calls D::D() --> B::B() --> B::f() --> B::vf()
    p->f();          // calls B::f() --> D:vf()
}

输出是:

B::vf
D::vf

【讨论】:

    【解决方案2】:

    我认为在 C++ 中 B::f() 的实现类似于 那:

    f(B *this) {
        *(this->vptr[index])(this);
    }
    

    index 的值在编译时总是已知的。 vtable 是“记录”(一种结构,如 C/C++ struct)而不是数组或“表”。就像这样:

    void f(B *This) {
        (This->vptr.ptr_f)(This);
    }
    

    注意:在 C 或 C++ 中,您不需要取消引用指向函数的指针。

    下面是通过虚机制调用的D::vf() 例子?

    B *p = new D();
    p->f();
    

    这取决于编译器及其“智能”。在低优化级别,它将通过虚拟机制(也称为动态调度)。

    使用高效的优化器,可以确定所使用对象的真实类型(此处为D),并且可以避免动态分派。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多