不建议这样做,因为如果在派生类构造函数还没有完成之前将其转换为基类指针,可能会导致未定义的行为。
这里是一个示例代码,其中派生类 D 从基类 B 继承,它的构造函数尚未完成时试图将 D 对象的指针转换为基类 B 的指针:
class B {
public:
virtual void foo() { cout << "B::foo" << endl; }
};
class D : public B {
public:
D() { /* 还没有完成构造 */ }
virtual void foo() { cout << "D::foo" << endl; }
void bar() {
B* basePtr = dynamic_cast(this); // 将 D 对象的指针转换为基类 B 的指针
if (basePtr) {
basePtr->foo(); // 调用 B::foo 或者 D::foo?
}
}
};
int main() {
D d;
d.bar();
}
上面的代码在某些编译器上可能输出 B::foo,而在某些编译器上可能输出 D::foo。这是因为派生类对象的构造函数没有完成,派生类中的数据成员可能还没有初始化,这会导致基类和派生类对象的布局不同。在这种情况下,将指向派生类的指针转换为指向基类的指针可能会导致未定义的行为。
因此,最好不要在对象的构造函数或析构函数中进行指针转换。如果确实需要在构造函数中使用基类指针,可以把指针转换推迟到构造函数的最后。另一种方法是使用工厂模式,通过工厂函数创建对象,而不是