受保护的抽象基类的构造函数和析构函数
Constructors and Destructors of abstract base class as protected?
我在某处读到抽象基类的构造函数应该受到保护?为什么这是一个推荐的实践,如果不加以保护,这些会如何被滥用?
如果您认为这是推荐的做法,您应该询问实际推荐这种做法的人。c++中的抽象类是至少有一个纯虚函数的类。编译器不会让你创建这样的类的实例,用受保护的构造函数来帮助它没有多大意义。这是基于你提供的信息,作者可能有理由,但你可能误解了这个概念。
我认为这个建议的重点是假设,核心可读性和维护。
在c++中,如果你的类中有任何纯虚方法,那么它被认为是抽象的并且自动地不可实例化。不需要受保护的医生。有一些功夫的方法来创建类似抽象类的对象,但如果你知道如何做,那是你的范式问题:)
然而,术语"抽象"也可以被认为只是类目的的一般描述。如果要求每个这样的"抽象"类都必须需要一个纯虚方法,那将是非常奇怪的。如果它对这个类没有任何意义呢?你必须引入一个完全无关的p-v方法,只是为了将类标记为"抽象"。通过将这些变量标记为protected,您可以确保您的-class-without-pure-virtuals也不能自由创建。
对维护也有很小的影响:假设你有一个绝对抽象的类,它有一些虚方法和一个纯虚方法。你让医生/医生公开。然后,半年之后,你修补/升级/修改类,你改变纯虚拟不"纯",并有一些默认的实现。哎呦。现在你的类是可创建的。[我故意忽略了纯虚拟可以有实现这一事实]。
当然,另一个问题是——没有虚拟方法的抽象基础有什么用?除了构建基于标志的半多态性之外,我找不到使用示例:
struct Base { protected: base(){} public: int type; }
struct Derived1:Base { derived1(){type=1;} int shoesize; string codename; }
struct Derived2:Base { derived2(){type=2;} string name, family; }
可以通过基指针传递derived1/2,并通过'type'标志检测它们的类型,然后手动转换它们。没有RTTI,没有变量表,非常轻的物体。有时候你需要它。
因此,保护它们是有好处的,但这种好处是……嗯,小。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在c++中使用向量时,如何调用构造函数和析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 不命名构造函数和析构函数上的类型错误
- 在 UML 类图中为C++类添加构造函数和析构函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 为什么类构造函数为其成员生成析构函数?
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 没有可调用的匹配函数(构造函数),候选函数不同于对给定类型的引用
- C++库制作,隐藏在标头中没有友元的析构函数/构造函数
- 从另一个成员函数/构造函数调用C++构造函数是否执行初始值设定项列表
- 在另一个函数/构造函数 [C++] 中初始化后使变量只读
- std::调用函数时找不到函数构造函数
- 显式调用基类析构函数/构造函数合法吗
- 函数构造函数和nullptr
- 用委托构造函数构造函数
- 虚函数构造函数和调用虚函数时会发生什么
- 一些Qt函数/构造函数参数的内存管理
- 使用for_each或std::transform时,c++函函数构造函数是如何被调用的?
- std函数构造函数初始化