请考虑以下事项:
// 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(),那么控制台应用程序确实沿着方法()的Bar实现进行了操作,这完全有道理。
这引出了一个问题,为什么不使用虚拟final来禁止在子类中隐藏该方法的名称? Foo类中提供的示例。
由于