微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c ++中的指针“ this”是否支持虚拟机制?

如何解决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,并且可以避免动态分配。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。