我在使用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
吗?
答案 0 :(得分:2)
因此不是切片问题。
在构造函数/析构函数中,虚拟方法不会被虚拟调用。
理性的是,物体尚未完全建造或已被部分摧毁。 this
指针不指向任何派生类,只指向当前正在构造/销毁的类(在本例中为A
)。
答案 1 :(得分:2)
A
的构造函数调用OtherClass
的构造函数,该构造函数调用A
的纯虚方法。
不幸的是,由于A
的实现此虚方法的子类尚未构造,因此结果是未定义的行为。
请记住:超类在子类之前构造。在构造B
之前(并因此实现纯虚方法),它的超类A
需要完全构造。当然,作为该过程的一部分,A
的构造函数被调用。