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