Sim*_*mon 5 c++ inheritance qt
我有一个基类,它定义了一个Qt插槽
class Base
{
public:
Base()
{
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot()
{}
}
Run Code Online (Sandbox Code Playgroud)
子类A只是实现了一些其他的东西.子类B覆盖插槽
class SubB : Base
{
public:
SubB() : Base()
{
// Necessary?
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot() override
{}
}
Run Code Online (Sandbox Code Playgroud)
插槽的覆盖是否也替换了之前在Bass构造函数中完成的连接(即SubB中的连接是不必要的)?
Rei*_*ica 10
它变得更好:您不需要对派生类中的插槽进行任何特殊处理.没有必要使它成为虚拟(它已经是每个C++语义),并且不需要再次使它成为一个插槽(它已经是每Qt语义).添加第二个连接是不正确的Derived,它只会导致每次激活信号时插槽被激活两次.
请记住,信号和插槽是常规的C++方法,并且这些插槽是从机器生成的代码中调用的,这些代码看起来就像调用插槽而没有指定应该使用的特定类.因此,虚拟插槽的行为与您认为应该的一样,给出C++的语义.
以下就足够了:
class Base : public QObject
{
Q_OBJECT
public:
Base(QObject * src, QObject * parent = 0) : QObject(parent)
{ connect(src, SIGNAL(mySignal), SLOT(mySlot)); }
Q_SLOT virtual void mySlot() {}
};
class Derived : public Base
{
Q_OBJECT
public:
Derived(QObject * src, QObject * parent = 0) : Base(src, parent) {}
void mySlot() Q_DECL_OVERRIDE { ... }
};
Run Code Online (Sandbox Code Playgroud)
您不需要connect在子类构造函数中添加相同的内容.当SubB对象被创建时,connect在Base构造将连接右槽(一个在SUBB覆盖).