Я предполагаю, что вы ищете принудительное выполнение этого условия во время компиляции (спасибо @Chad за указание на это)
В C ++ нет никакого прямого языкового механизма, о котором я знаю.Я имею в виду, что нет зарезервированного ключевого слова, которое нужно поставить перед объявлением метода, которое бы достигло желаемой цели.
Я думаю, что то, что вы говорите, указывает на проблему дизайна в вашем программном обеспечении.Допустим, вы хотите принудительно переопределить метод foo () всеми классами inherirhing в следующем фрагменте
class BaseButConcrete
{
... //Common stuff
... //
virtual void foo()
{ /*implementation that you do not want to be inherited, but will be...*/ }
}
class DerivedOtherConcrete : public BaseButConcrete
{
void foo()
{ /*different implementation,
but no obligation from compiler point of view*/ }
}
Я не вижу хорошей причины для разработки, почему все общие элементы не могут быть перемещены в абстрактномБазовый класс. Из того, что вы описываете , вы не хотите наследовать реализацию foo в Derived, поэтому не наследуйте эту часть!Таким образом, очень классический дизайн должен сработать:
class AbstractBase
{
... //Common stuff has moved here
... //
virtual void foo() =0;
}
class NotAnymoreBaseButStillConcrete : public AbstractBase
{
void foo()
{ /*implementation that should not be inherited,
and that will not by design*/ }
}
class DerivedOtherConcrete : public AbstractBase
{
void foo()
{ /*different implementation,
now mandatory compiler-wise for the class to be concrete*/ }
}
Таким образом, общий материал все еще распределяется между всеми вашими производными классами, и вы сохраняете то, что не хотите наследовать (то есть Реализация foo ) разделена на классы не по одному и тому же пути наследования.