Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当实例化是可能的,但iheritance不在C++; < C++ >装饰器软件设计模式适合在有类型的时候使用,它可以被实例化,但有一个限制,它不允许您从该类继承,以便添加一些功能。p> 我的问题是:C++中的哪些情况下,我可以有一个类的实例,但不能从同一个类继承?< p>如果C++编译器是C++ 11兼容的,那么可以声明类是使类不可继承的: class A final { };_C++_Design Patterns_Inheritance_Decorator_Instantiation - Fatal编程技术网

当实例化是可能的,但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++依赖程序员阅读文档,因此内置的最终< /COD>机制是很好的,但是您不想承担运行时成本(对于虚拟基础)或可用性成本(对于工厂函数,因为类型只能被复制构建,例如,它影响了它与一些容器成员函数的使用)。只是为了强制执行文档


因此,类型应该记录它们是否打算用作基类,而忽略该文档的用户只能怪自己。

任何具有
私有
构造函数和静态工厂方法的类。例如,具有私有构造函数的类。这应该与java中的
final
相同。这是一个安全和性能的问题。如果您允许(其他人)继承/子类化您的代码,那么您必须非常小心地注意受保护/私有的方法,这些方法必须是它们的方式。。。或者不要让他们继承你的。编辑:你们其他人读过他的问题吗?他没有问怎么做;-)@那不是安全问题。无论是C++还是java都不阻止运行机制的运行。@ KORADRUDROPH:那么在java中,我如何规避<代码>最终< /代码>机制,以便做最明显的有用的开发,哪种方法是将我自己的
String
子类传递到依赖于该实例的安全管理器代码中,该实例在进行有效性测试时不会更改?我的知识可能已经过时了,但我认为
java.lang.String
的最终不确定性和不变性即使在加载了不可信字节码的JVM中也是可以依赖的。一般来说,除了
final
please…@Narek,然后是Jon建议的私有构造函数和静态工厂函数。有时人们说如果你不是“所有者”,你就不能从类继承。这是什么意思?@Narek你必须问他们这是什么意思,这对我来说没有意义。