Member 13999828 Ответов: 2

Может ли кто-нибудь объяснить мне этот синтаксис Microsoft MFC ! ! ! ! !


мы использовали мастера проектов Visual Studio для создания некоторых базовых графических приложений с помощью VC++.

При отладке я заметил, что родной код MFC пронизан таким синтаксисом, как этот:

derivedClass::метод()

{

базовый класс::метод();

}

Для exmaple я создал простое приложение для Windows под названием MFCApp.

Мастер естественным образом создает классы, производные от CwinAppEx, CDocument и CView, называемые CMFCAppAPP, CMFCAppDoc и CMFCAppView.

Внутри реализации этих производных классов я часто сталкиваюсь с таким кодом, как:

void CMFCAppDoc::AssertValid() const
{
CDocument::AssertValid();
}
и

void CMFCAppView::Dump(CDumpContext& dc) const
{
CView::дамп(dc);
}
Я очень озадачен этим, потому что, согласно всем книгам, которые я прочитал, и моему опыту, вы можете вызвать метод базового класса только через оператор разрешения области видимости, если и только если этот метод статичен, что во всех этих примерах, с которыми я столкнулся в коде MFC, это не так. Компилятор должен отметить ошибку компиляции C2352 ссылка на которую находится здесь:

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2352?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DEN-US%26k%3Dk(C2352)%26rd%3Dtrue&view=vs-2017

Пожалуйста, помогите мне, потому что я очень озадачен.

Большое Спасибо, Рез

Что я уже пробовал:

Это вопрос, так что я ничего не пробовал.

2 Ответов

Рейтинг:
1

KarstenK

Это вызовы реализации базового класса методов. Не ferget, что эти кода в коде экземпляра класса и не снаружи.

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


Рейтинг:
0

Member 13999828

Thanks for your reply.

Then please tell me why the following does not work ?

class base

{

public:
virtual void OddFunction() const;
};

class Derived: public base
{
public:
virtual void  OddFunction() const;
};

Derived OddFunction()
{
base::OddFunction();
}

int main()
{
Derived d;
       d.OddFunction();

}

Many Thanks,  Rez


Rick York

Если вы хотите задать вопрос о чьем-то решении, вы должны использовать "Есть вопрос комментария?" кнопка под этим решением. вы не должны публиковать свой вопрос в качестве другого решения.

Rick York

В вашем примере кода в этом "решении" есть множество синтаксических проблем. Вот он с теми исправленными :

class base
{
public:
    virtual void OddFunction() const
    {
        // this needs to have some implementation if it is going to be called
    }
};

class Derived: public base
{
public:
    virtual void OddFunction() const;
};

void Derived::OddFunction()   // must have a return type and class specification
{
   base::OddFunction();
}

int main()
{
    Derived d;
    d.OddFunction();
}

KarstenK

Рик прав, и плз прочитала о виртуальном ключевом слове. Это как-то заполнитель, который нуждается в некоторой реализации. Еще одна интересная тема-интерфейсы.