C++初学者之RTTI

来源:互联网 发布:淘宝海淘真假 编辑:程序博客网 时间:2024/06/07 02:40

#include <iostream>

using namespace std;
int main(void)
{
int a;
cout << typeid(a).name() << endl;
cout << typeid(int).name() << endl;
cout << typeid(float).name() << endl; 
// 因为“一个接口,多种方法”,,
/*
面临的是许多不同的类对象,,当然,这些事同族类,
借助于 virtual,使用基类指针,,(其实基类指针就是一层包装,) 
从而实现所有派生类都可以进来,
然后就是识别问题,,,
这时候就是要借助于 typeid().name() 了
然后  ,,拆开基类指针这层包装,,这是就需要dynamic_cast 来拆开基类指针这层包装了!!!
666! 
*/ 
return 0;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// dynamic_cast
/*
dynamic_cast 后面接的必须是多态类型的,必须要包含虚函数 
*/
#include <iostream>
using namespace std;


class Person
{
public:
int a;
int b;
void eat()
{
cout << "person eat " << endl;
}
virtual void sleep()
{
cout << "person sleep " << endl;
}
};
class Student:public Person
{
public :
/*
virtual void sleep()
{
cout << "student sleep " << endl;
}*/// 在此处写了一个和基类同名,同参的函数,此时因为是virtual 修饰,所以会发生覆盖,而不是隐藏!!! 
void eat()
{
cout << "student eat " << endl;
}// 在此处写了一个和基类同名,同参的函数,此时因为并没有virtual 的修饰,所以会发生隐藏,即父类的对应函数会被隐藏!! 
// 呵呵,差点被自己搞糊涂了!!! 
void work()
{
cout << "student class " << endl;
}
int a;
int b;
};
class Teacher: public Person
{
public :
void work()
{
cout << "teacher work " << endl;
}
int a;
int b;
};
int main(void)
{
Person * p = new Student;
p->sleep();// 借助于父类指针,访问到了隐藏的父类部分! 
p->eat();
Student * s = dynamic_cast<Student *>(p);
s->sleep();// 借助于虚函数实现 
s->work();
s->eat();
// 将基类指针转化为该指针实际所指的派生类型的指针类型 
Teacher * t = dynamic_cast<Teacher *> (p);
delete p; 
return 0;


/////////////////////////////////////////////////////////////////////////////////////////////////

//RTTI Run Time Type Idenfication
// 运行时类型识别!!!
// 定义: 通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型
/*
解析定义:(我发现高手说话总是很精练,同常第一遍读的时候总是会漏掉高手想表达的一些概念) 
注意: 使用基类的指针或者引用!!
问题来了,,是不是别的指针或者引用就不行了呢???
RTTI 是在什么情况下使用的呢???
其实就是在 借助基类指针或者引用这件包装的时候才需要RTTI去识别(也就是拆开包装),
所以特指基类指针也是无可厚非的,当然,RTTI也是可以在别的情况下使用的!! 


补充:

为什么一定要拆开包装呢??不拆也是能用的的啊!?
我知道了,,“不拆也是能用的”这是针对那些在子类中被 virtual 修饰过的函数而言的,,
那些普通的成员函数,隶属子类的成员函数依旧还是不能通过父类指针来操控的!!!
所以,拆掉包装是很有必要的!!!
*/ 



--- Jack_Lu

0 0
原创粉丝点击