我正在使用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也无处不在,我只是没有做那么多多重继承。
答案 0 :(得分:1)
这是一个XY问题:您正在询问解决方案,但是您要解决的实际问题是什么?这些类代表什么? “发送和接收类型”是什么意思?关于不共享继承层次结构,有很简单的方法:可以通过常用实现的方法提供通用接口,如果将Q_GADGET
或Q_OBJECT
添加到类中,则可以进行自省-假设它们还不是QObject
。如果您使用QObject
,则可以通过QMetaObject::invokeMethod
或通过QMetaMethod::invokeOnGadget
类型的Q_GADGET
以编程方式调用方法,除{之外,实际上不需要任何通用接口{1}}本身。
示例:
QObject