使用这个切片我的对象

Using this slice my object

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

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 切片 class B。然后 OtherClass 将调用 A 上的纯虚方法。我错了?我应该在 B class 初始化之后制作 OtherClass(*this) 吗?

因此不是切片问题。

在constructor/destructor中,虚拟方法没有被虚拟调用。

原因是该对象还没有完全构建,或者已经部分销毁。 this 指针不指向任何派生的 class,仅指向当前为 constructed/destructed 的 class(在本例中为 A)。

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

不幸的是,由于A的实现这个虚方法的子类还没有构造,结果是未定义的行为。

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