В рамках иерархии классов С++ можно ли требовать, чтобы конкретная виртуальная функция всегда вызывала также реализацию базового класса? (Как путь цепи конструкторов?)
Я рассматриваю случай, когда иерархия глубоких классов имеет некоторые общие функции интерфейса, которые каждый ребенок переопределяет. Я бы хотел, чтобы каждый производный класс переопределял цепочку к базовому классу. Прямо сделать это явно, например, с помощью кода ниже, но существует риск того, что кто-то, внедряющий новый производный класс, может забыть пробиться к базе.
Есть ли какой-нибудь шаблон для принудительного применения этого параметра, так что компилятор будет вызывать ошибку, если переопределение не может привязать базу?
Итак, в
class CAA
{
virtual void OnEvent( CEvent *e ) {
// do base implementation stuff;
}
}
class CBB : public CAA
{
typedef CAA BaseClass;
virtual void OnEvent( CEvent *e ) {
DoCustomCBBStuff();
BaseClass::OnEvent( e ); // chain to base
}
}
class CCC : public CBB
{
typedef CBB BaseClass;
virtual void OnEvent( CEvent *e ) {
Frobble();
Glorp();
BaseClass::OnEvent( e ); // chain to CBB which chains to CAA, etc
}
}
class CDD : public CCC
{
typedef CCC BaseClass;
virtual void OnEvent( CEvent *e ) {
Meep();
// oops! forgot to chain to base!
}
}
Есть ли способ, какой-то шаблонный трюк или синтаксический трюк, чтобы сделать CDD более очевидной ошибкой?