【发布时间】:2020-01-26 04:17:50
【问题描述】:
我不知道如何总结我的问题,所以在 Google 上找不到答案。
重写父方法时,
void Child::method(){
//stuff
Parent::method();
}
完美运行。但是父方法需要来自 Child 类实例的信息才能正常工作,这不是作为参数给出的。所以我的问题是,C++ 是否有一种机制让 Parent 知道 Child 类的哪个实例调用 Parent 方法,比如 而不 做 Parent::method(this) ?
让我想到的是,如果你这样做,
int main(){
SomeParentClass::someMethod();
}
它给出:错误:在没有对象参数的情况下调用非静态成员函数。因此编译器需要知道子类中没有给出的实例。但没有引发错误,所以它一定知道实例。
编辑:我添加了 Qt 标签,因为我正在尝试 Qt 类。如果需要,我可以举个例子。
编辑2:
devicedialog.h
class DeviceDialog : public QDialog
{
Q_OBJECT
public:
explicit DeviceDialog(QWidget *parent = nullptr);
int exec() override;
~DeviceDialog() override;
}
devicedialog.cpp
int DeviceDialog::exec(){
// My code.
return QDialog::exec();
}
exec() 函数激活并在屏幕上显示一个 QDialog。但是,以这种方式调用它,似乎父方法无法知道要显示哪个对话框(没有传递参数)。唯一的知识可能是调用它的实例的身份。我只是问这些知识是否转移到后台的方法中。
【问题讨论】:
-
C++ 是否有一种机制让 Parent 知道 Child 类的哪个实例调用 Parent 方法 -- 这种机制被称为“好设计”。您需要澄清或更详细地解释这意味着什么——但父方法需要来自 Child 类实例的信息才能正常工作。
-
@PaulMcKenzie 请检查编辑。
-
之前没有调用函数来“设置父级”并提供信息吗?这就是父母“了解孩子”的明显原因。
exec()之前的子对象为父对象提供了信息。 -
@PaulMcKenzie 似乎没有。唯一的事先声明是
devicedialog.cpp中的DeviceDialog::DeviceDialog(QWidget *parent) : QDialog(parent), ui(new Ui::DeviceDialog)。但是父级是 nullptr 或 MainWindow(取决于选择),Ui调用只影响子级。 -
没有“知道父级”的 C++ 语法。这都是你使用的任何东西的内部设计的一部分,你只需要更仔细地了解它为什么会以它的工作方式工作。没有魔法发生——你只是没有看到它。您之前提出这种语法的尝试表明这只是一个设计问题,而不是语法问题。
标签: c++ qt c++11 inheritance