当实例化是可能的,但iheritance不在C++; < C++ >装饰器软件设计模式适合在有类型的时候使用,它可以被实例化,但有一个限制,它不允许您从该类继承,以便添加一些功能。p> 我的问题是:C++中的哪些情况下,我可以有一个类的实例,但不能从同一个类继承?< p>如果C++编译器是C++ 11兼容的,那么可以声明类是使类不可继承的: class A final { };
如果您无法访问支持当实例化是可能的,但iheritance不在C++; < C++ >装饰器软件设计模式适合在有类型的时候使用,它可以被实例化,但有一个限制,它不允许您从该类继承,以便添加一些功能。p> 我的问题是:C++中的哪些情况下,我可以有一个类的实例,但不能从同一个类继承?< p>如果C++编译器是C++ 11兼容的,那么可以声明类是使类不可继承的: class A final { };,c++,design-patterns,inheritance,decorator,instantiation,C++,Design Patterns,Inheritance,Decorator,Instantiation,如果您无法访问支持final关键字的编译器,则必须将构造函数设置为私有,并使用静态工厂方法: class A { A() {} public: A createA() { return A(); } }; 在C++03中可以使用一个技巧来避免需要工厂: struct Final; struct FinalHelper { friend struct Final; private: FinalHelper() {} ~FinalHelper() {
final
关键字的编译器,则必须将构造函数设置为私有,并使用静态工厂方法:
class A
{
A() {}
public:
A createA() { return A(); }
};
在C++03中可以使用一个技巧来避免需要工厂:
struct Final;
struct FinalHelper {
friend struct Final;
private:
FinalHelper() {}
~FinalHelper() {}
};
struct Final : private virtual FinalHelper {
Final() {}
};
这实际上并没有阻止某人使用Final
作为基类,但它确实阻止了他们构造或销毁其派生类。原因是派生最多的类负责构造和销毁虚拟基,但是FinalHelper
的构造函数和析构函数在派生最多的类中不可访问,除非它是Final
当然,这可能有运行时内存成本(对于虚拟基)
通常这样的把戏是没有意义的。C++依赖程序员阅读文档,因此内置的因此,类型应该记录它们是否打算用作基类,而忽略该文档的用户只能怪自己。任何具有
私有构造函数和静态工厂方法的类。例如,具有私有构造函数的类。这应该与java中的final
相同。这是一个安全和性能的问题。如果您允许(其他人)继承/子类化您的代码,那么您必须非常小心地注意受保护/私有的方法,这些方法必须是它们的方式。。。或者不要让他们继承你的。编辑:你们其他人读过他的问题吗?他没有问怎么做;-)@那不是安全问题。无论是C++还是java都不阻止运行机制的运行。@ KORADRUDROPH:那么在java中,我如何规避<代码>最终< /代码>机制,以便做最明显的有用的开发,哪种方法是将我自己的String
子类传递到依赖于该实例的安全管理器代码中,该实例在进行有效性测试时不会更改?我的知识可能已经过时了,但我认为java.lang.String
的最终不确定性和不变性即使在加载了不可信字节码的JVM中也是可以依赖的。一般来说,除了final
please…@Narek,然后是Jon建议的私有构造函数和静态工厂函数。有时人们说如果你不是“所有者”,你就不能从类继承。这是什么意思?@Narek你必须问他们这是什么意思,这对我来说没有意义。