1. 程式人生 > >C++學習總結(二十六)——RTTI型別檢查,類指標型別轉換

C++學習總結(二十六)——RTTI型別檢查,類指標型別轉換

#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();
}