【发布时间】:2015-03-21 11:49:35
【问题描述】:
我有两个班级 Base 和 Derived 是这样的:
class Base
{
public:
};
class Derived : public Base
{
public:
};
主要功能:
int main()
{
Base* ptr = new Derived;
std::cout << typeid(*ptr).name() << endl;
delete ptr;
system("pause");
}
程序输出显示class Base,我预计它会显示class Derived。但是当我在Base 类中添加一个虚方法时,现在输出显示class Derived!
为什么 RTTI 至少需要一个虚拟方法?
【问题讨论】:
-
看起来像Typeid not functioning correcly的复制品,基本上如果你添加虚拟方法你会得到你想要的结果。
-
如果你在写一个编译器,你会如何实现
typeid?我可能会把它作为一个隐藏的虚拟方法来做。但是如果该类没有任何虚拟方法(因此没有 vtable),这是不可能的。我认为 C++ 规范是为了适应这一点而编写的。 -
您将
ptr声明为Base*。你还有什么期待?它不像 Java 有运行时类型检查。 C++ 完全是静态的。 -
@texasbruce:当然,但是当
Base类至少有一个虚拟方法时,程序会给出预期的结果,这就是我的观点。