Вызов виртуальной функции С++

172
11 января 2017, 01:56
class Receiver:public Task
{
...
private:    //override
    long                    Process();
private:
...
};
long Receiver::Process()
{
...
}
class Task{                                             
    ...                             
private:
    ...
    virtual long        Process()=0;
...
};  
inline Task *   Task::TaskExec(Thread *ThisThread)
{
...
    long l_retval   =-10000;
...
    try{l_retval =Process();}catch(...){} // ?
...
}

Не понимаю как вызывается функция Receiver::Process() в проекте. Искал через (ctrl+shift+f), нашел только использование в Task::TaskExec(). Разве можно вызывать функцию Process(), которая виртуальная(=0)?

Answer 1

Примерно так (см. комментарии). Более-менее понятно или нужно пояснять подробнее?

class Base
{
public:
    virtual void vf() = 0;
    void func()
    {
        // Здесь вызывается vf() КОНКРЕТНОГО класса, с
        // использованием т.н. позднего связывания
        vf();
    }
};
class Derived: public Base
{
public:
    // Перекрытая виртуальная функция
    void vf()
    {
        cout << "In Derived\n";
    }
};
int main()
{
    // Здесь b, будучи указателем на Base, указывает на объект Derived
    Base * b = new Derived;
    // Вступает в игру позднее связывание. В вызове func выясняется,
    // на что именно указывает b, и внутри вызывается vf() этого объекта.
    b->func();
}

Кстати, чисто виртуальная функция может иметь тело и быть вызываема:

class Base
{
public:
    virtual void vf() = 0
    {
        cout << "In Base\n";
    }
    void func()
    {
        vf();
    }
};
class Derived: public Base
{
public:
    virtual void vf()
    {
        Base::vf();
        cout << "In Derived\n";
    }
};
int main()
{
    Base * b = new Derived;
    b->func();
}
READ ALSO
Вывести в консоль квадрат в квадрате со ***

Вывести в консоль квадрат в квадрате со ***

Здравствуйте! С обычным квадратом все просто, но как в него засунуть поменьше квадрат, вот это проблемка

210
Передача массива в функцию и range-based цикл

Передача массива в функцию и range-based цикл

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

147
Как собрать библиотеки WebM для MinGW

Как собрать библиотеки WebM для MinGW

Стоит задача реализовать в приложении на C++ потоковое видео (для браузеров), дали направление - WebMНа официальном сайте куча репозиториев (кодеки,...

172
Установка библиотек QT creator в Astra Linux

Установка библиотек QT creator в Astra Linux

Всем приветМне необходимо работать в Астра-Линукс и разрабатывать в нем приложения

480