Контекст:
Я пишу библиотеку C++ для решения определенных классов математических уравнений. Библиотека предоставляет класс Equation с несколькими виртуальными функциями, которые пользователи библиотеки используют в качестве базового класса для конкретного уравнения, которое они хотят решить. Библиотека также предоставляет класс Solver, который принимает уравнение * в качестве параметра конструктора. Затем пользователь пишет код следующего вида:
Код: Выделить всё
class MyEquation : public Equation
{ ... } // equation definition here
int main()
{
MyEquation myEqn;
Solver solver(&myEqn);
solver.Solve();
}
- Я хотел бы сделать это прозрачным для пользователей библиотеки, поэтому я не ищу решение, в котором, например, пользователь устанавливает некоторые флаги в конструкторе своего производного уравнения, указывая, какие функции были переопределены.
- Одним из возможных решений является установка по умолчанию реализаций виртуальных функций в Equation для установки частного флага в классе Equation; конструктор класса Solver может затем очистить этот флаг, запустить виртуальную функцию и проверить значение флага, чтобы увидеть, была ли вызвана реализация в Equation. Однако мне бы хотелось этого избежать, потому что простая установка флага каждый раз при выполнении виртуальной функции значительно замедляет алгоритм (выполнение этих виртуальных функций существенно увеличивает время выполнения программы, а реализации по умолчанию просто возвращают константу).
Подробнее здесь: https://stackoverflow.com/questions/474 ... derived-cl
Мобильная версия