考虑以下:
// 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 类试图通过 Foo::method() 成员函数遵循 NVI 模式。
是什么阻止了子类(在本例中为 Bar)使用 Bar::method() 隐藏 Foo::method()?我试过了,我猜什么都没有。如果您取消注释 Bar::method(),控制台应用程序确实会执行 method() 的 Bar 实现,这完全有意义。
这就引出了一个问题,为什么不使用 virtual final 来禁止在子类中隐藏该方法的名称?Foo 类中提供的示例。
谢谢