当实例化是可能的,但在c++中不能继承时
When the instantiation is possible but iheritance is not in C++
在c++中,当你有一个类型,它可以被实例化,但有一个限制,不允许你从那个类继承,以增加一些功能时,可以使用Decorator软件设计模式。
我的问题是:在c++中,我可以有一个类的实例,但不能从同一个类继承的情况是什么?
如果你的c++编译器是c++ 11兼容的,你可以声明类为final
,使类不可继承:
class A final
{
};
如果你不能访问支持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++依赖于程序员阅读文档,因此内置的final
机制是可以的,但是您不想仅仅为了强制文档而产生运行时成本(对于虚基)或可用性成本(对于工厂函数,因为类型只能是复制构造的,这例如会影响它与某些容器成员函数的使用)。
因此,类型应该记录它们是否打算用作基类,而忽略文档的用户只能怪他们自己。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么虚函数不能是静态的和全局的?
- 为什么我不能在 while 循环中创建线程?
- 为什么这个音频包络不能通过开关的情况?
- 不能将复制初始化与隐式转换的多个步骤一起使用