1. 程式人生 > >c++父類與子類的轉換(QT環境下)

c++父類與子類的轉換(QT環境下)

今天重構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);
    }

}