使用此切片我的对象

时间:2016-08-16 23:57:19

标签: c++ object-slicing

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

2 个答案:

答案 0 :(得分:2)

因此不是切片问题。

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

理性的是,物体尚未完全建造或已被部分摧毁。 this指针不指向任何派生类,只指向当前正在构造/销毁的类(在本例中为A)。

答案 1 :(得分:2)

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

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

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