c++父类与子类的转换(QT环境下)

来源:互联网 发布:运营商网络重构步骤 编辑:程序博客网 时间:2024/06/15 01:12

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





原创粉丝点击