有人可以向我解释为什么这段代码会打印Base,Derived但是如果我从Base print Base,Base省略了f函数吗?
#include <iostream>
#include <cstdio>
using namespace std;
class Base;
void testClassType (Base& b);
class Base
{
virtual void f(){};
};
class Derived :public Base
{
};
int main ()
{
Base b;
Derived d;
testClassType(b);
testClassType(d);
}
void testClassType(Base& b)
{
cout<<endl<<"It is:"<<typeid(b).name();
}
答案 0 :(得分:8)
根据typeid
的定义,它返回多态类型的表达式的 dynamic 类型和 static 类型的表达式对于非多态类型。
多态类型是一种至少具有一个虚函数的类类型。
在您的情况下,当您致电testClassType(d)
时,b
函数中的表达式testClassType
具有静态类型Base
和动态类型Derived
。但是,如果Base
中没有单个虚拟函数,typeid
将始终报告静态类型 - Base
。完成Base
多态后,代码将报告b
的动态类型,即Derived
。
最重要的是,正如Oli在评论中正确指出的那样,type_info::name()
方法的结果不能保证包含任何有意义的信息。它可以为所有类型返回相同的"Hello World"
字符串。
答案 1 :(得分:2)
具有至少一个虚拟成员函数的类称为多态类。
多态类的每个实例在运行时都以某种方式关联用于实例化的原始类。这用于例如typeid
。还用于调用虚拟成员函数。
当您通过删除f
使该类成为非多态时,testClassType
中已知的所有内容都是Base
。没有运行时检查类型。
干杯&amp;第h。,