Ответ 1
Это настолько возможно, что на самом деле это поведение по умолчанию. То есть если вы не объявляете свои методы экземпляра класса явно как virtual
, они не могут быть overridden в подклассах (только hidden, который является другим - и почти всегда ошибочным -).
Эффективное С++ Third Edition, статья 36 подробно обсуждает это. Рассмотрим
class B {
public:
virtual void vf();
void mf();
virtual void mf(int);
...
};
class D: public B {
public:
virtual void vf(); // overrides B::vf
void mf(); // hides B::mf; see Item33
...
};
D x; // x is an object of type D
B *pB = &x; // get pointer to x
D *pD = &x; // get pointer to x
pD->vf(); // calls D::mf, as expected
pB->vf(); // calls D::mf, as expected
pD->mf(); // calls D::mf, as expected
pB->mf(); // calls B::mf - surprise!
pD->mf(1); // error - D::mf() hides B::mf(int)!
pB->mf(1); // calls B::mf(int)
Таким образом, это не совсем так, как final
ведет себя в Java, но вы можете приблизиться только к С++. Альтернативой может быть предотвращение подклассификации вообще. Технически - работающее, но не очень приятное решение - объявить все ваши конструкторы private
(и предоставить статический метод factory, если вы хотите, конечно, разрешить создание экземпляра своего класса).