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

今天重构QT控件获得焦点的函数时,需要将基类传化为子类,尝试过一些办法后成功,记录一下。

1.子类向基类(向上强制类型转换)

切割:覆盖方法和子类数据丢失的现象生成切割(slice)。

下面套用一个别人的例子

#include "stdafx.h"  
#include   
using namespace std;  
  
class Base  
{  
public:  
    int b;  
    virtual void Test()  
    {  
        cout << "base" <Test();  
    //b3->check();  
  
    system("PAUSE");  
    return 1;  
}  
然后我们看监视的结果

c++父类与子类的转换(QT环境下)_第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"<(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(Current_focus);
        int n=aaa->GetNum();
        DouClicked(n);
    }

}





你可能感兴趣的:(C/C++,qt)