给父类指针调用子类的方法
Call method on subclass given pointer to superclass
我有一组按钮:
buttons = new QButtonGroup();
button_0 = new MyButton("A", this);
button_1 = new MyButton("B", this);
button_2 = new MyButton("C", this);
MyButton是一个QPushButton,继承了QAbstractButton。组中只能选择一个MyButton。
MyButton::MyButton(const QString &text, QWidget *parent)
: QPushButton(text, parent)
{
this->setCheckable(true);
this->setChecked(false);
}
MyButton有一个增量方法。
void MyButton::increment()
{
this->j++;
}
我想在当前选择的MyButton实例上调用increment方法。有一个方便的checkedButton()
方法,我可以在buttons
上调用,但它返回一个指向QAbstractButton的指针。
我不能在指针或QAbstractButton上调用increment
。buttons->checkedButton()->increment();
生成error: no member named 'increment' in 'QAbstractButton'
。如何增加选中的MyButton?
您只需要让编译器知道您正在使用MyButton*
而不是QAbstractButton*
,这意味着强制转换。
如果你知道指针是MyButton*
,那么你可以直接设置为static_cast<MyButton*>(buttons->checkedButton())->increment();
如果你不知道它是否是MyButton*
,那么你需要检查一下,这意味着像这样:
MyButton* temp = dynamic_cast<MyButton*>(buttons->checkedButton());
if(temp != nullptr) temp->increment();
编辑:SaZ指出qobject_cast
比dynamic_cast
更可取,因为:
它不需要RTTI支持,它可以跨动态库边界工作
MyButton
已经继承自QObject
,但还有一个条件,即它与Q_OBJECT
一起声明。如果满足这两个条件,那么您可以简单地将dynamic_cast
替换为qobject_cast
:
MyButton* temp = qobject_cast<MyButton*>(buttons->checkedButton());
if(temp != nullptr) temp->increment();
注意,在QObject
派生类的情况下,您可以并且应该使用qobject_cast()
而不是动态强制转换。使用Qt元系统可以提高效率。
而且,与动态强制转换不同的是,它可以在没有RTTI的情况下编译,也可以使用动态库。
将QAbstractButton
动态强制转换为MyButton
,并调用increment()
QAbstractButton* abstractButton = buttons->checkedButton();
MyButton* myButton = dynamic_cast<MyButton*>(abstractButton);
if (myButton)
{
myButton->increment();
}
为了完整起见,在Qt程序的情况下,你也可以使用信号槽系统:如果increment
被声明为slot
,那么这将工作:
QMetaObject::invokeMethod(abstractButton, "increment");
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将子类方法声明为基类的友元
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- C ++类型特征:确保子类实现方法
- 函数从唯一代码调用正确的子类方法
- Arduino在子类中使用父类方法
- C++强制在子类中实现方法,但具有不同的签名
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 如何调用传递给 JNI 'jobject' 的 Java 对象的子类/子类的方法
- 将方法参数类型更改为子类中的派生类
- 如果指针的子类的方法对于子类是唯一的,如何访问这些方法?
- C++继承,如何在基类的方法中调用子类的方法?
- 在子类上调用模板化静态方法时获取类的类型名
- 检查子类是否执行了方法重写
- 将"this"从父类方法转换为子类方法是一种好的做法吗?
- 从C++中的父类实例访问子类方法
- 基类中的虚拟方法和子类中的非 Virtula 方法.仍然如何调用子类方法,即使它是非虚拟的
- C ,基础课程如何将子类作为成员包含并调用其方法