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

59 篇文章 1 订阅

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值