C++ 中的指针"this"是否支持虚拟机制?



考虑一下:

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(); 

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

有一个稍微修改过的例子:

#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

我认为在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(,并且可以避免动态调度。

最新更新