Информация об изменениях

Сообщение Re: Автоматический обход иерархии от 14.09.2022 14:04

Изменено 14.09.2022 14:05 Videoman

Re: Автоматический обход иерархии
Здравствуйте, Kazmerchuk Pavel, Вы писали:

KP>Можно ли сделать это автоматически или хотя бы выдать ошибку если пользователь забыл вызвать эту функцию из базы.


Такая проблема возникает, обычно, когда иерархия спроектирована не аккуратно и переопределяемая функция выполнят не только расширяемый функционал, но и часть базового. Я всегда использую идиому NVI (Non-Virrtual Interface) в таких случаях. Подход зависит от задачи, но идя следующая:
#include <iostream>

struct base 
{
    void f() 
    { 
        std::cout<< "Base prolog\n";
        specific();
        std::cout<< "Base epilog\n";
    }

private:

    virtual void specific()
    {
        std::cout<< "Base specific\n";
    }
};

struct derived : base
{
private:

    virtual void specific()
    {
        std::cout<< "Derived specific\n";
    }
};

int main()
{
    base b;
    b.f();
    
    derived d;
    d.f();
    
    return 0;
}
Re: Автоматический обход иерархии
Здравствуйте, Kazmerchuk Pavel, Вы писали:

KP>Можно ли сделать это автоматически или хотя бы выдать ошибку если пользователь забыл вызвать эту функцию из базы.


Такая проблема возникает, обычно, когда иерархия спроектирована не аккуратно и переопределяемая функция выполнят не только расширяемый функционал, но и часть базового. Я всегда использую идиому NVI (Non-Virrtual Interface) в таких случаях. Подход зависит от задачи, но идeя следующая:
#include <iostream>

struct base 
{
    void f() 
    { 
        std::cout<< "Base prolog\n";
        specific();
        std::cout<< "Base epilog\n";
    }

private:

    virtual void specific()
    {
        std::cout<< "Base specific\n";
    }
};

struct derived : base
{
private:

    virtual void specific()
    {
        std::cout<< "Derived specific\n";
    }
};

int main()
{
    base b;
    b.f();
    
    derived d;
    d.f();
    
    return 0;
}