c++父類與子類的轉換(QT環境下)
阿新 • • 發佈:2018-12-31
今天重構QT控制元件獲得焦點的函式時,需要將基類傳化為子類,嘗試過一些辦法後成功,記錄一下。
1.子類向基類(向上強制型別轉換)
切割:覆蓋方法和子類資料丟失的現象生成切割(slice)。
下面套用一個別人的例子
然後我們看監視的結果#include "stdafx.h" #include <iostream> using namespace std; class Base { public: int b; virtual void Test() { cout << "base" <<endl; } }; class Derived:public Base { public: int tt; int d; virtual void Test() { cout << "derived" <<endl; } virtual void check() { cout << "derived check" <<endl; } }; int main() { Derived d; d.d = 1; d.tt = 2; Base b = d;//直接賦值(產生切割) (可以直接賦值進行轉換) b.Test(); Base& b2 = d;//使用引用賦值(不產生切割) b2.Test(); Base* b3 = &d;//使用指標賦值(不產生切割) b3->Test(); //b3->check(); system("PAUSE"); return 1; }
2.基類向子類(向下強制型別轉換)
條件為:1、源型別必須有虛擬函式;
2、必須開啟編譯器的RTTI開關(vc6: progect-> settings -> c/c++ tab ->category[c++ language]-> Enable RTTI);
3.必須有繼承關係。
引用別人的程式:
class A { public: //要使用dynamic_cast,父類必須要有一個虛擬函式 virtual void print() { cout<<"Class A"; } }; class B:public A { public: void fun() { cout<<"Class B"<<endl; } }; int main() { //pA必須是它的子類所初始化 A *pA = new B; //成功時返回子類指標,否則返回0 //將指向父類的pA指標轉成指向子類的指標pB B *pB = dynamic_cast<B*>(pA); if (pB) { //訪問子類的fun函式 pB->fun(); } delete pA; return 0; }
另外貼上自己在QT中更改的程式碼(片段)
這裡QWidget是MyLabel的基類
getnum是MyLabel的函式
void Widget::keyPressEvent(QKeyEvent *k ) { if(k->key()==Qt::Key_A) { bool a=this->focusNextChild();//按A時焦點切換至上一部件 qDebug("%d",a); } else if(k->key() ==Qt:: Key_D) { this->focusNextPrevChild(TRUE);//按D時焦點切換至下一部件 } if(k->key()==Qt::Key_Enter||k->key()==Qt::Key_Return)//呼叫回車進入子程式 { QWidget *Current_focus=new MyLabel; Current_focus=QApplication::focusWidget(); MyLabel *aaa=dynamic_cast<MyLabel*>(Current_focus); int n=aaa->GetNum(); DouClicked(n); } }