У меня есть шаблон класса, в котором некоторые методы определены как виртуальные, чтобы дать пользователю моего класса возможность реализовать для них реализацию в своем производном классе. Обратите внимание, что в моем классе-шаблоне есть несколько невиртуальных методов, которые используют виртуальный (виртуальный класс, который должен возвращать значение, вызывается в невиртуальном классе).
Можете ли вы дать мне простой пример правильного кода, в котором виртуальный метод родительского класса должен возвращать значение (но его реализация предоставляется в дочернем классе), а значение, возвращаемое виртуальным методом в родительском классе, используется в другом методы этого класса. Потому что я где-то видел (например, здесь: Безопасное переопределение виртуальных функций C ++), что это может вызовет некоторые проблемы, и определенный пользователем метод заметит переопределение виртуального метода родительского класса.
Примечание: я программирую с помощью Code :: Blocks, используя компилятор g ++.
РЕДАКТИРОВАТЬ: по просьбе здесь простой пример того, что я хочу:
template<typename T>
class parent {
public:
// Public methods that user can call
int getSomething(T t);
void putSomething(T t, int x);
// public method that user should implement in his code
virtual float compute(T t) { }
// protected or private methods and attributes used internally by putSomething ...
float doComplexeThings(...); // this can call
};
Метод compute () должен быть реализован пользователем (дочерним классом). Однако этот метод compute () вызывается, например, putSomething () и doComplexeThings ().
virtual float compute(T t)
. Вы просто используете его (вызываете) внутри putSomething () и doComplexeThings () черезt.compute()
, если у вас есть дескриптор экземпляра. Компилятор выдаст ошибку, если ваш класс T не реализует вычисление. Таким образом, родительский элемент и T на самом деле даже не должны жить в одной и той же иерархии наследования: то есть, T является дочерним элементом родительских отношений, не требуется. Это также может дать вам возможность дать родителю более значимое имя (поскольку связь is-a не обязательна). - person kfmfe04   schedule 26.01.2012float compute(...)
, который вызываетсяdoComplexeThings(...)
иputSomething(...)
, в то время как код методаfloat compute(...)
должен быть предоставлен пользователем. - person shn   schedule 26.01.2012