c++ - 在给定指向父类(super class)的指针的子类上调用方法

标签 c++ qt inheritance

我有一组按钮:

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 实例上调用增量方法。有一个方便的 checkedButton() 方法,我可以在 buttons 上调用它,但它会返回一个指向 QAbstractButton 的指针。

我不能在指针或 QAbstractButton 上调用 incrementbuttons->checkedButton()->increment(); 产生错误:“QAbstractButton”中没有名为“increment”的成员。如何增加所选的 MyButton?

最佳答案

你只需要让编译器知道你正在使用 MyButton*而不是 QAbstractButton* ,这意味着类型转换。

如果知道指针是MyButton*那么你可以做一个static_cast<MyButton*>(buttons->checkedButton())->increment();如果你不知道它是不是 MyButton*然后你需要检查,这意味着像这样:

MyButton* temp = dynamic_cast<MyButton*>(buttons->checkedButton());

if(temp != nullptr) temp->increment();

编辑: SaZ has pointed out qobject_cast 优于 dynamic_cast因为:

It doesn't require RTTI support and it works across dynamic library boundaries

MyButton已经继承自 QObject , 但还有一个条件,它是用 Q_OBJECT 声明的.如果满足这两个条件,那么您可以简单地替换 dynamic_castqobject_cast :

MyButton* temp = qobject_cast<MyButton*>(buttons->checkedButton());

if(temp != nullptr) temp->increment();

关于c++ - 在给定指向父类(super class)的指针的子类上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929120/

相关文章:

c++ - 为什么我的基类指针变量不能从派生类访问函数?

c++ - 需要澄清类的虚函数和私有(private)成员

c++ - 为什么 std::is_assignable 使用相关的指针类型返回 false?

qt - 测试变量是否为空并在 qmake 期间给出默认值

if语句中的C++ QList,默认值是多少?

C++,Qt4 - QLabel.setText() 似乎会导致段错误

c++ - 是否可以删除取消引用的指针

c++ - 在C++中使用模板类的嵌套类作为模板模板参数

c++ - 理解和解析来自 gcc 的警告

c# - C#中的构造函数和继承问题