Учтите следующее:
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"#include <string>
#include <iostream>
using namespace std;
class Foo {
public:
// NVI
bool method() {
cout << "Foo::method" << endl;
return method_impl();
}
// Why not do this instead?
//virtual bool method() final {
// cout << "Foo::method" << endl;
// return method_impl();
//}
private:
virtual bool method_impl() = 0;
};
class Bar : public Foo {
public:
// What stops someone from doing this hiding the Foo::method identifier?
// Uncomment the below and see how the console output is instead Bar::method and then method_impl
//bool method() {
// cout << "Bar::method" << endl;
// return method_impl();
//}
private:
virtual bool method_impl() override {
return true;
}
};int _tmain(int argc, _TCHAR* argv[]) {
Bar bar = Bar();
cout << bar.method() << endl;
return 0;
}
Как вы можете видеть выше, класс Foo пытается следовать шаблону NVI с помощью функции-члена Foo :: method ().
Что мешает дочернему классу, в данном случае Bar, скрыть Foo :: method () с Bar :: method ()? Я попробовал это, и я ничего не думаю. Если вы раскомментируете Bar :: method (), консольное приложение действительно завершит реализацию Bar метода method (), что имеет смысл.
Возникает вопрос: почему бы не использовать виртуальный финал, чтобы запретить скрытие имен этого метода в дочернем классе? Пример предоставлен в классе Foo.
Спасибо
Задача ещё не решена.
Других решений пока нет …