请注意,C++ 11中存在不可继承的类final
,使用在: base1, base2, ..., baseN
继承列表之前指定的关键字,或者在开始之前,{
如果类继承自任何内容:
class Final final { }; class Derived : public Final { }; // ERROR
通过一点宏观魔法和一些编译器检测工作,这可以在所有编译器上被抽象出去工作,或者最坏的情况下无所事事.
请注意,C++ 11中存在不可继承的类final
,使用在: base1, base2, ..., baseN
继承列表之前指定的关键字,或者在开始之前,{
如果类继承自任何内容:
class Final final { }; class Derived : public Final { }; // ERROR
通过一点宏观魔法和一些编译器检测工作,这可以在所有编译器上被抽象出去工作,或者最坏的情况下无所事事.
那么,对于这个程序(pleasse提供正确,可编译的例子)
#includeclass Temp { private: ~Temp() {} friend class Final; }; class Final : virtual public Temp { public: void fun() { std::cout<<"In base"; } }; class Derived : public Final {}; int main() { Derived obj; obj.fun(); }
Comeau Online说
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ C++0x_extensions "ComeauTest.c", line 16: error: "Temp::~Temp()" (declared at line 6) is inaccessible class Derived : public Final { ^ detected during implicit generation of "Derived::Derived()" at line 21 "ComeauTest.c", line 16: error: "Temp::~Temp()" (declared at line 6) is inaccessible class Derived : public Final { ^ detected during implicit generation of "Derived::~Derived()" at line 21 2 errors detected in the compilation of "ComeauTest.c".
因为,当有疑问时,我总是信任como(我只发现过一个错误,但其他编译器中有很多错误),我想VC9(接受代码)是错误的.(从那以后void main()
我想你也使用VC.)
C++ FAQ描述了实现这一目标的不同方法 - 但是根据你的问题,我猜你已经阅读过了.;-)
(此外,main
必须始终返回int
,永远不会void
.)
好奇地反复出现模板模式.使用私有继承.
template< typename T > class Final { protected: Final() {} Final( Final const& ) {} }; class X : private virtual Final{ // whatever I want to do };
并且您应该发现无法从X派生任何内容,因为虚拟继承意味着派生程度最高的类必须构造基类,但它不具有对它的任何访问权限.
(我没有测试过这段代码).