【发布时间】:2011-09-19 15:11:20
【问题描述】:
删除期间C++类型改变
我了解到,当您构造派生类型时,类型会根据调用的构造函数而改变。因此,如果您创建派生对象并使用基指针调用虚函数,通常它会映射到派生类中的实现。但是,如果您在基类构造函数中调用虚函数,它将使用基类实现,因为在该函数中对象的类型在技术上是基类的类型。例如(临时代码,如果无法编译,请见谅):
class Base {
Base()
{
std::cerr << "Base Constructor.";
func();
}
virtual void func() {
std::cerr << "Func base called." << std::endl;
}
};
class Derived : public Base {
Derived()
{
std::cerr << "Derived Constructor.";
func();
}
void func() {
std::cerr << "Func derived called." << std::endl;
}
};
int main() {
Derived* d = new Derived;
delete d;
}
应该输出:
Base Constructor.
Func base called.
Derived Constructor.
Func derived called.
首先,这总是正确的还是依赖于实现?
如果我使用 RTTI 和 typeinfo,那么在 base 中打印的类型是否实际上是 base 的类型,或者这更像是一种不成文的规则之类的情况?
考虑到这一点从构造函数调用虚函数是否危险,或者只要你知道自己在做什么就安全吗?
【问题讨论】:
标签: c++