#include <typeinfo>
#include <iostream>
using namespace std;
class A
{
public:
void show()
{
cout << "A::show()" << endl;
}
private:
virtual void donothing()
{
}
};
class B : public A
{
public:
void show()
{
cout << "B::show()" << endl;
}
};
class C : public A
{
public:
void show()
{
cout << "C::show()" << endl;
}
};
void display1(A * pA)
{
pA->show();
}
void display2(A * pA)
{
if (typeid(B) == typeid(*pA))
{
static_cast<B *>(pA)->show();
}
else if (typeid(C) == typeid(*pA))
{
static_cast<C *>(pA)->show();
}
else
{
pA->show();
}
}
void display3(A * pA)
{
if (NULL != dynamic_cast<B *>(pA))
{
static_cast<B *>(pA)->show();
}
else if (NULL != dynamic_cast<C *>(pA))
{
static_cast<C *>(pA)->show();
}
else
{
pA->show();
}
}
int main()
{
A a;
B b;
C c;
cout << "dynamic binding" << endl;
display1(&a);
display1(&b);
display1(&c);
cout << "RTTI - typeid" << endl;
display2(&a);
display2(&b);
display2(&c);
cout << "RTTI - dynamic" << endl;
display3(&a);
display3(&b);
display3(&c);
return 0;
}
把type_info的一个指针存在vtable中, 以实现RTTI, 这样对象可以通过vptr找到type_info, 这样一来类中必须有一个虚函数了, A中的donothing就是为了这个目的
RTTI的大多数功能都可以直接通过多态来实现, 比如上面就可以能过把A中的show声明为virtual来达到与RTTI一样的效果
上面的static_cast, 我并没有用dynamic_cast, 应该是可以的吧, 毕竟到用static_cast代码处时, 类型应该是对的, 不会出现切割的问题, 转换也就不会有问题的
(指针的dynamic_cast转换失败返回NULL, 引用则抛出bad_cast异常)