2012-05-24 22 views
3

C++ 11引入了关键字final,这使得从类型派生非法。如何防止从C++ 03中的类型派生?

有没有办法用C++ 03实现类似的结果,也许通过使某些成员函数private

+0

如果您仍有兴趣有效的解决方案,我可以共用一个。让我知道。 – PiotrNycz

+0

@PiotrNycz:当然 –

回答

2

有用于C++03两种解决方案:


解决方案一:私有的虚拟朋友基类私有的默认构造函数:

在此基础上answer,不同之处在于模板不使用 - 因此我们可以让虚拟基类成为“最终”类的朋友。

class A; 
class MakeAFinal { 
private: 
    MakeAFinal() {} 
    // just to be sure none uses copy ctor to hack this solution! 
    MakeAFinal(const MakeAFinal&) {} 
    friend class A; 
}; 

class A : private virtual MakeAFinal { 
// ... 
}; 

坦率地说,我不喜欢这个解决方案,因为它增加了不必要的虚拟主义。 这一切都可以包含在宏,增加使用的可读性和容易:

#define PREPARE_CLASS_FINALIZATION(CN) \ 
    class CN; \ 
    class Make##CN##Final { \ 
    Make##CN##Final() {} \ 
    Make##CN##Final(const Make##CN##Final&) {} \ 
    friend class CN; } 

#define MAKE_CLASS_FINAL(CN) private virtual Make##CN##Final 

PREPARE_CLASS_FINALIZATION(A); 
class A : MAKE_CLASS_FINAL(A) { 
// ... 
}; 

解决方法二:所有构造函数是私有的(包括拷贝构造函数)。该类的实例与友元类的帮助下创建:

class AInstance; 
class A { 
// ... 
private: 
// make all A constructors private (including copy constructor) to achieve A is final 
    A() {} 
    A(const A&) {} // if you like to prevent copying - achieve this in AFinal 
    // ... 
    friend class AInstance; 
}; 
struct AInstance { 
    AInstance() : obj() {} 
    AInstance(const AInstance& other) : obj(other.obj) {} 
    // and all other constructors 
    A obj; 
}; 

// usage: 
AInstance globalA; 
int main() { 
    AInstance localA; 
    AInstance ptrA = new AInstance(); 
    std::vector<AInstance> vecA(7); 
    localA = globalA; 
    *ptrA = localA; 
}