使用这个切片我的对象



我在使用this时遇到了一些困难,它似乎分割了我的派生类。这个例子将帮助我解释我的问题。

class A 
{
    A() {
        OtherClass(*this);
    }
    virtual doSomething() = 0;
}
class B : public A
{
    B() : A() {}
    doSomething() override {
        std::cout << "Hi!" << std::endl;
    }
}
class OtherClass() 
{
    OtherClass(A &a) {
        a.doSomething();
    }
}

经过一些研究,似乎使用*this对类B进行切片。然后OtherClass将在A上调用一个纯虚拟方法。我错了?初始化B类之后,我应该制作OtherClass(*this)吗?

A的构造函数调用OtherClass的构造函数,后者调用A的纯虚拟方法。

不幸的是,由于实现该虚拟方法的A的子类尚未构建,因此结果是未定义的行为。

记住:超类是在子类之前构造的。在构造B(从而实现纯虚拟方法(之前,需要完全构造它的超类A。当然,作为这个过程的一部分,A的构造函数会被调用。

因此不是切片问题。

在构造函数/析构函数中,虚拟方法不是虚拟调用的。

合理的理由是对象没有被完全构建,或者已经被部分破坏。this指针不指向任何派生类,只指向当前正在构造/销毁的类(在本例中为A(。

相关内容

  • 没有找到相关文章

最新更新