/*
带虚函数与不带虚函数转换的区别。
dynamic_cast:必须要有虚函数才可以转换。
dynamic_cast:只能处理转换指针或引用,不能转换对象。
dynamic_case 只能识别多态数据类型,转换失败就是null
多态,父类指针可以根据多态转化为子类指针
子类指针存储一个父类指针,转换失败。指针为 00000
子类指针转换成父类,自动转换。
typeid:自动识别类型,依赖于虚函数
//虚函数重载和返回值无关,和参数个数,顺序有关。
//虚函数被继承下来了还是虚函数。
//如果要使用被继承的虚函数,不允许出现虚函数 重载 ,这是C++编译器的问题。
//多态可以跨类。爷爷辈的指针,可以存储孙子辈的地址、父辈拔针的地址
*/
#include<iostream>
using namespace std;
/*
没有虚函数的情况下,子类同名函数会覆盖父类,
父类指针存储子类地址:
1、有虚函数情况:调用子类方法
2、没有虚函数情况:调用父类方法
*/
class base1
{
public:
virtual void show()
{
cout << "base1->show" << endl;
}
};
class baseX :public base1
{
public:
void show()
{
cout << "baseX->show" << endl;
}
};
class base2
{
public:
void show()
{
cout << "base2->show" << endl;
}
};
class baseY :public base2
{
public:
void show()
{
cout << "baseY->show" << endl;
}
};
void main08_A()
{
baseX *px = new baseX;
px->show();
base1 *p1 = new baseX; //父类指针,指向子类地址
p1->show();
//typeid:自动识别类型,依赖于虚函数
//有虚函数的 *p1 是 baseX 类型 没有是 base1类型,typeid:自动识别类型。
cout << typeid(p1).name() << endl; //p1:class base1 *
cout << typeid(*p1).name() << endl;//*p1:class baseX 的对象,因为虚函数的存在,检测到*p 为class baseX 的对象.
baseY *py = new baseY;
py->show();
base2 *p2 = new baseY;
p2->show();
cout << typeid(p2).name() << endl;
cout << typeid(*p2).name() << endl;
// dynamic_case 只能识别多态数据类型,转换失败就是null
//dynamic_cast:必须要有虚函数才可以转换。
baseX *pX = dynamic_cast<baseX *>(p1);
pX->show();
//dynamic_case 只能识别多态数据类型。所以下面这句的转换失败!
//baseY *pY = dynamic_cast<baseY *>(p2);
//pY->show();
cin.get();
}
void main08_B()
{
//多态,父类指针可以根据多态转化为子类指针
//子类指针存储一个父类指针,转换失败。指针为 00000
base1 *p1 = new base1;
base1 *p2 = new baseX;
baseX *px = dynamic_cast<baseX *>(p1); //使用子类指针存储一个父类指针。
//px->show(); //可以通过编译,但是执行会崩溃。
//打印地址可以看看,地址为:0000000
cout << "px:"<<(void *)px << endl;
cin.get();
}