免责声明:该描述包含许多 Qt 细节。他们没有必要回答这个问题,我只是想给你介绍一下背景。
我需要对此做出反应focusInEvent
of a QTextEdit
。
不幸的是,这不能作为信号使用,这就是为什么我需要子类化QTextEdit
。由于这是我需要的唯一更改,因此我想使用匿名子类
像这样:
myTextEdit =new QTextEdit(){
void focusInEvent(){
//code here
}
};
这是我用 Java 编写的代码,它不能用 C++ 编译。
以下所有代码都在自定义的构造函数内QWidget
. The QTextEdit
包含在此小部件中,应在其构造函数中初始化。
奇怪的是,这段代码编译后:
class MyTextEdit:protected QTextEdit{
void focusInEvent();
};
auto myTextEdit=new MyTextEdit();
但没用,因为我无法分配一个实例myTextEdit*
指向一个指针QTextEdit
。不知何故,多态性失败了。此代码无法编译:
class MyTextEdit:protected QTextEdit{
void focusInEvent();
};
QTextEdit* myTextEdit=new MyTextEdit();
编译器错误是:
/home/lars/ProgrammierPraktikum/moleculator/implementation/Moleculator/gui_elements/editor.cpp:40:
错误:“QTextEdit”是无法访问的基础
'编辑器::编辑器(std::shared_ptr)::MyTextEdit'
QTextEdit* myTextEdit=new MyTextEdit();
实际问题:
如何创建与其超类的指针兼容的匿名子类?
您的子类化尝试
class MyTextEdit:protected QTextEdit{
void focusInEvent();
};
QTextEdit* myTextEdit=new MyTextEdit();
差不多就可以了
仅仅因为该方法受保护并不意味着您应该使用 protected 进行继承。
- 受保护的方法说:这不是我的界面的一部分。除了我之外没有人可以这么称呼。我自己称之为(作为事件处理的一部分)。该方法可以在子类中被重写。
- 继承受保护说:没有人应该知道这个继承,它是一个实现细节,可能对扩展我的类有用。
你想要常规的公共继承。
class MyTextEdit:public QTextEdit{
void focusInEvent();
};
QTextEdit* myTextEdit=new MyTextEdit();
现在您说 MyTextEdit 是 QTextEdit 的替代品。
您可能想要添加一个构造函数来向 MyTextEdit 提供父窗口小部件。
C++中不存在类似java的匿名内部类这样的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)