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