Откуда С ++ знает, что дочерний класс вызывает родительский метод? - PullRequest
0 голосов
/ 26 сентября 2019

Я не знаю, как суммировать мой вопрос, поэтому не могу найти ответ в Google.

При переопределении родительского метода,

void Child::method(){
    //stuff
    Parent::method();
}

Работает отлично.Но родительский метод требует, чтобы информация из экземпляра класса Child работала должным образом, а это не аргументыПоэтому мой вопрос: есть ли в C ++ механизм, позволяющий Parent узнать, какой экземпляр класса Child вызывает метод Parent, например, без выполнения Parent::method(this)?

То, что заставляет менядумаю, что если вы сделаете что-то подобное,

int main(){
    SomeParentClass::someMethod();
}

Это даст: error: вызов нестатической функции-члена без аргумента объекта. Таким образом, компилятору необходимо знатьэкземпляр, который также не был дан в дочернем классе.Но не выдало ошибку, поэтому он должен был знать экземпляр.

Редактировать: Я добавил тег Qt, потому что я экспериментирую с классом Qt.Чтобы я мог привести пример, если это необходимо.

Edit2:

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 на экране.Однако при таком способе его вызова кажется, что у родительского метода нет способа узнать, какой диалог показывать (параметры не переданы).Единственным знанием может быть личность вызывающего его экземпляра.Я просто спрашиваю, передаются ли эти знания методу в фоновом режиме.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Я думаю, что вас просто смущает попытка языка облегчить вам жизнь.Ваша примерная функция эквивалентна

void Child::method(){
    //stuff
    this->Parent::method();
}

Так же, как вы не можете вызвать (нестатический) метод в дочернем классе без объекта, вы не можете вызвать метод родителя без объекта.Тем не менее, контекст является основой такого метода.Внутри тела контекст считается *this.Так же, как вы можете ссылаться на элементы данных без явного префикса "this->", вы можете вызывать методы без префикса.

2 голосов
/ 26 сентября 2019

В этом нет ничего особенного для функций-членов родительского класса.Вызов функции дочернего класса посредством явного присвоения имени типа:

Child::method();

в этом отношении работает точно так же.Использование вне определения функций-членов приводит к той же ошибке.

Соответствующий параграф стандарта: §9.3.1:

Когда id-выражение, которое не является частьюсинтаксис доступа к члену класса и не используется для формирования указателя на член используется в члене класса X в контексте, где это можно использовать, если поиск имени разрешает имя в выражении id в нестатический типчлен некоторого класса C, и если либо id-выражение потенциально оценивается, либо C является X или базовым классом X, id-выражение преобразуется в выражение доступа к члену класса с использованием (* this) в качестве выражения postfix дляслева от.operator.

Другими словами, вызов

Parent::method();

внутри функции-члена превращается во что-то похожее на

(*this).Parent::method();
1 голос
/ 26 сентября 2019

Это все еще специфический для С ++ вопрос.Qt просто использует это.Вам необходимо изучить объекты, наследование и виртуальные методы.

void Child::method() {
  Parent::method();
  // this->Parent::method();
}

Вышеописанное работает, потому что у ребенка есть доступ к методам родителей (которые не являются частными).Поскольку метод является переопределением виртуального метода parent, единственный способ для компилятора узнать, что вы хотите вызвать метод parent, - это вызвать его с разрешением области действия «::» в дочернем элементе.

int main() {
  SomeParentClass::someMethod();
}

Выше не работает, потому что нет созданного объекта.Когда вы вызываете метод, вы вызываете его для объекта (если это не статический метод).Поэтому вместо этого вы бы сделали что-то вроде:

int main() {
  SomeParentClass parent;
  parent.someMethod();

  ChildClass child;
  child.someMethod(); // accesses the childs overridden method and not the parents.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...