【发布时间】:2018-12-31 04:30:35
【问题描述】:
我正在使用 gcc 4.8.5 在使用 Qt5 的项目中构建模板库,目标是发送和接收不共享继承层次结构的类型。我想出的一种可能的解决方案是,基类可以简单地定义信号和插槽,而派生类可以提供实现,这很有效。现在,为了编译时优化和运行时性能,如果我在基类中有数百个这样的方法会发生什么?
我无法找到的另一个有效问题似乎是当两个派生类继承同一个对象时在编译期间会发生什么。下面举个例子:
class A{}
class B : A{}
class C : A{}
这种结构在编译时有什么好处吗?此外,Qt 不会为一个类创建 moc,除非它定义了一个信号或槽,所以会有
class A {
void slot_1();
//...
void slot_100();
}
停止编译,这是否有任何运行时开销?我知道 Qt 插槽下面只是一个函数,因此在内存中只创建了一个函数。另外,我知道派生类必须链接 moc_a.o 文件,但我不太确定链接器能够优化到什么程度。
注意:我知道这违反了 SRP 和 OCP,但上面列出了我最大的担忧和障碍。我愿意研究替代示例和解决方法,只要它们不是不必要的复杂且编译时友好。 ISP 也出局了,我根本没有做那么多的多重继承。
【问题讨论】:
-
我不清楚,你先说没有继承层次结构,然后是派生 QObject 来实现信号/插槽。虚拟函数有一点运行时开销,是的,但除非你在嵌入式廉价系统上工作,否则大多数时候它可以忽略不计。你的确切问题是什么?
-
我稍后会发布更新,但我的问题是如果我将所有可能的信号和槽添加到基类中,其中每个派生模板类只使用一个信号,我的编译器会处理它还是在编译/链接期间吓坏了。我想出了如何通过 castin 函数来做到这一点
-
@jfhcs 为什么还要问?您可以通过编程方式生成
.h文件和一堆模板实例,然后编译并查看。但这样做的理由是零。感谢 Qt Quick,Qt 完全支持信号和槽的在线生成。
标签: c++ qt class inheritance linker