Сообщение Re: Автоматический обход иерархии от 14.09.2022 14:04
Изменено 14.09.2022 14:05 Videoman
Re: Автоматический обход иерархии
Здравствуйте, Kazmerchuk Pavel, Вы писали:
KP>Можно ли сделать это автоматически или хотя бы выдать ошибку если пользователь забыл вызвать эту функцию из базы.
Такая проблема возникает, обычно, когда иерархия спроектирована не аккуратно и переопределяемая функция выполнят не только расширяемый функционал, но и часть базового. Я всегда использую идиому NVI (Non-Virrtual Interface) в таких случаях. Подход зависит от задачи, но идя следующая:
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я следующая:
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;
}