【发布时间】:2015-09-18 09:14:17
【问题描述】:
免责声明:此描述包含许多 Qt 细节。他们不需要回答这个问题,我只是想给你背景。
我需要对QTextEdit 的focusInEvent 做出反应。
不幸的是,这不能作为信号使用,这就是为什么我需要子类QTextEdit。由于这是我需要的唯一更改,我想使用匿名子类
像这样:
myTextEdit =new QTextEdit(){
void focusInEvent(){
//code here
}
};
这是我用 Java 编写的代码,它不能用 c++ 编译。
以下所有代码都在自定义 QWidget 的构造函数中。 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”是一个无法访问的基础 'Editor::Editor(std::shared_ptr)::MyTextEdit' QTextEdit* myTextEdit=new MyTextEdit();
实际问题:
如何创建与其超类的指针兼容的匿名子类?
【问题讨论】:
-
为什么要使用受保护的继承?如果您使用公共继承,那么您的最后一个示例将编译。
-
@ThomasSparber,我需要覆盖该事件。它被标记为虚拟保护。
-
@ThomasSparber,我看了那个问题,但问题不一样。另一个问题询问如何捕获外部变量。我不需要任何外部变量,我只想修改其焦点事件的文本字段。我的问题是匿名类的类型
-
我不明白你对被标记为虚拟保护的事件发表评论。如果事件是一个类,“标记为虚拟保护”对我来说没有多大意义。顺便说一句,为什么这被标记为 java?
标签: java c++ qt polymorphism anonymous-types