我在使用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
(。