C++學習總結(二十六)——RTTI型別檢查,類指標型別轉換
阿新 • • 發佈:2019-02-13
#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(); }