使用这个切片我的对象
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
的构造函数被调用。
我在使用 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
的构造函数被调用。