Здравствуйте, Andy_sh, Вы писали:
A_>Если функция не переопределена, то вызвать ее не нужно (в базовом классе она является заглушкой). Кроме того, вызову функции могут предшествовать некие действия, как вычисление аргумента, а если функция не переопределена, то и вычисления не нужны.
А функций много? В смысле не реализаций, а функций в интерфейсе?
Если не много, то можно пойти по такому пути, что для каждой функции завести свой интерфейс, и выводиться только из тех интерфейсов, которые поддерживаешь. Ну а на клиентской стороне можно по dynamic_cast получать нужный интерфейс и в зависимости от этого действовать
Дополнительный плюс -- можно объединять функции в группы.
struct ICommon { virtual ~ICommon() {} }; // Общий предок, через который передаётся владение и т. п.
struct IFunction1 { virtual void F1() = 0; };
struct IFunction2 { virtual void F2() = 0; };
struct IFunction3 { virtual void F3_1() = 0; virtual void F3_2() = 0;};
class ImplA : public ICommon, public IFunction1, public IFunction3 {
// тут реализация F1, F3_1 и F_2
};
void callFXXX( ICommon* p )
{
if( IFunction1* p1 = dynamic_cast<IFunction1*>( p ) ) {
p1->F1();
}
if( IFunction2* p2 = dynamic_cast<IFunction2*>( p ) ) {
p2->F2();
}
if( IFunction3* p3 = dynamic_cast<IFunction3*>( p ) ) {
p3->F3_1();
p3->F3_2();
}
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском