昨天有人问我这个问题,在java中这不是个问题,因为有final关键字,而C++11中也有final关键字。
比如 class finalClass final { };
但C++11之前呢,如何实现?
首先想到的是可以将构造函数声明为private的,这样是可以阻止被别人继承,但这个类用起来也是很不方便,只能通过static成员函数来得到一个对象指针。
如果要在栈上定义一个对象都做不到,太麻烦了。
网上有一种方法是用virtual inheritance来实现,先看看示例代码:
$ cat final_class.cpp
#include <iostream>
using namespace std;
template <typename T>
class Helper
{
friend T;
private:
Helper() {cout<<"Helper::Helper\n";}
~Helper(){cout<<"Helper::~Helper\n";}
};
class finalClass : virtual public Helper<finalClass>
{
public:
finalClass(){cout<<"finalClass::finalClass\n";}
~finalClass(){cout<<"finalClass::~finalClass\n";}
};
class Derivation: public finalClass
{
public:
Derivation(){cout<<"Derivation::Derivation\n";}
~Derivation(){cout<<"Derivation::~Derivation\n";}
};
int main(int argc, char* argv[])
{
//Helper<int> a;
finalClass b;
Derivation c;
return 0;
}
这里Helper是一个辅助类,用来帮助finalClass成为不能被继承的类。
Derivation类试图继承finalClass,结果编译报错(在ubuntu上):
$ g++ final_class.cpp -std=c++11; ./a.out
final_class.cpp: In constructor ‘Derivation::Derivation()’:
final_class.cpp:9:5: error: ‘Helper<T>::Helper() [with T = finalClass]’ is private
Helper() {cout<<"Helper::Helper\n";}
^
final_class.cpp:23:21: error: within this context
Derivation(){cout<<"Derivation::Derivation\n";}
^
final_class.cpp:10:5: error: ‘Helper<T>::~Helper() [with T = finalClass]’ is private
~Helper(){cout<<"Helper::~Helper\n";}
^
final_class.cpp:23:21: error: within this context
Derivation(){cout<<"Derivation::Derivation\n";}
^
final_class.cpp: In destructor ‘Derivation::~Derivation()’:
final_class.cpp:10:5: error: ‘Helper<T>::~Helper() [with T = finalClass]’ is private
~Helper(){cout<<"Helper::~Helper\n";}
^
final_class.cpp:24:22: error: within this context
~Derivation(){cout<<"Derivation::~Derivation\n";}
----------------------------------------