NVI не предотвращает сокрытие имени; почему бы не использовать виртуальный финал вместо этого?

Учтите следующее:

// 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.

Спасибо

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]