以下案例:假设有一个二进制库定义了“Base”类,以及它的许多子类(“Derivative1”、“Derivative2”等)。
我想在我自己的代码中扩展这些子类,但是因为我的扩展对于所有子类都是相同的,因为它们只处理 Base 的一部分,所以对每个 Derivative 类进行子类化并一遍又一遍地添加相同的代码会很乏味。
我的第一个想法是简单地编写一个可以为我完成工作的类模板,但是因为我正在处理的库是 Qt,所以 QObject 挫败了我。我的第二个想法是使用宏来生成每个类结构,但这也被 moc 所阻挠。
标题中的“reparent”是因为我想到了从 Base 派生并创建 BaseExtended,然后以某种方式告诉编译器将每个 Derivative 重新设置为这个扩展类。有没有办法例如在“BaseExtended”虚拟中声明“Base”,然后只写
class Derivative1Extended : public Derivative1, public BaseExtended {}
并让 BaseExtended 中的虚拟 Base 指向 Derivative1 中的 Base,从而基本上“挤压”我在 Base 和 Derivative1 之间的扩展?
(顺便说一句,我试图使上述内容尽可能通用,但我实际上正在做的是尝试为每个 QWidget 派生添加“focusIn”和“focusOut”信号,而不是一遍又一遍地编写相同的代码我使用的 QWidget 子类)
编辑:作为参考,这是我当前的实现:
// qwidgetfs.h
class QLineEditFS : public QLineEdit
{
Q_OBJECT
private:
void focusInEvent(QFocusEvent *);
void focusOutEvent(QFocusEvent *);
public:
QLineEditFS(QWidget *parent = 0);
signals:
void focusReceived(QWidgetFS::InputType);
void focusLost();
};
// qwidgetfs.cpp
QLineEditFS::QLineEditFS(QWidget *parent /*= 0*/)
: QLineEdit(parent)
{}
void QLineEditFS::focusInEvent(QFocusEvent *e)
{
QLineEdit::focusInEvent(e);
emit focusReceived(QWidgetFS::InputText);
}
void QLineEditFS::focusOutEvent(QFocusEvent *e)
{
QLineEdit::focusOutEvent(e);
emit focusLost();
}
这对 QSpinBoxFS、QComboBoxFS、QCheckBoxFS 等重复...相反,我只想在公共类 QWidgetFS 中定义这个逻辑,然后将其“注入”到从 QWidget 派生的其他类中