#include<iostream>
using namespace std;
//rtti实时类型检测
//成员变量的覆盖,静态变量也会覆盖。
//
class A
{
public:
int num=0;
static int data;
virtual void run()//拥有虚函数,
{
cout << "Arun";
}
};
int A::data = 0;
class B :public A
{
public:
int num=0;
static int data;
void run()
{
cout << "Brun";
}
void test()
{
cout << "Btest";
}
};
int B::data = 1;
void main1()
{
B b1;
b1.num = 10;
b1.A::num = 20;
cout << b1.num << ' ' << b1.A::num << endl;
cout << b1.data << ' ' << b1.A::data<< endl;
cin.get();
}
void main2()
{
A *p1 = new A;
A *p2 = new B;
//不包含虚函数时,指针指向的对象都是A,包含虚函数时,指向B
cout << typeid(*p1).name() << typeid(*p2).name() << endl;
cout << typeid(p1).name() << typeid(p2).name() << endl;
cin.get();
}
//dynamic进行数据类型转换
void main()
{
A a1;
B b1;
A *p1 = &a1;
A *p2 = &b1;
B *p3(nullptr);
p3 = dynamic_cast<B*>(p2);
//dynamic类中必须包含虚函数,否则不能进行转换
//根据虚函数表进行转换
p3->test();
cout << p3 << endl;
p3 = dynamic_cast<B*>(p1);
p3->test();
cout << p3 << endl;
std::cin.get();
}
//static进行数据类型转换
void main3()
{
A a1;
B b1;
A *p1 = &a1;
A *p2 = &b1;
B *p3(nullptr);
p3 = static_cast<B*>(p2);//直接赋值地址,与有无虚函数无关
p3->test();
cout << p3 << endl;
p3 = static_cast<B*>(p1);
p3->test();
cout << p3 << endl;
std::cin.get();
}
C++学习总结(二十六)——RTTI类型检查,类指针类型转换
最新推荐文章于 2025-07-04 16:54:45 发布