你什么时候使用:
受保护的构造函数/析构函数?
受保护的继承主类?
class Name:Protected Main
如果它太广泛,可以用一个实例的每个问题的一个简短示例,因为我只是在寻找一个开始的想法。
答案 0 :(得分:3)
答案 1 :(得分:2)
Scott Meyers以这种方式解释:
class D : public B
:“D
提供界面B
”。
class D : private B
:“D
是使用B
”实现的。
(受保护的继承不是那么有用。)
受保护的构造函数/析构函数对于您希望仅以第二种方式使用的类非常有用,即为了提供其他类的实现。在这种情况下,只有派生类需要调用构造函数和析构函数,因此可以对其进行保护。
私有构造函数意味着只有类本身可以创建自身的实例,这对于工厂或创建者模式很流行,其中静态成员函数返回指向实例的指针,但直接构造不希望有类实例。
答案 2 :(得分:2)
私有构造函数/析构函数?
私有构造函数/析构函数适用于任何类对象实例应由其他 manager 类管理的类(例如,它具有它管理的类的所有实例的列表)。一个例子:
class AManager;
class A {
private:
friend class AManager;
A() {};
~A() {};
}
class AManager {
public:
A* createA() { a = new A(); aList.add(a); return a; }
void destroy(A* a) { aList.remove(a); delete a; }
private:
list<A> aList;
}
受保护的构造函数/析构函数?
如果您只想创建类的子类(例如,如果您的类只是一个抽象类,但没有纯虚方法,那么理论上它可以在公共构造函数的情况下实例化):
class A {
protected:
A() {};
~A() {};
}
class A1: public A {
public:
A1() {}
}
class A2: public A {
public:
A2() {}
}
这最有意义的是工厂模式的一部分:
class AFactory {
public:
A* createA() {
if(someCondition()) return new A1();
else return new A2();
}
void destroyA(A* a) { delete a; }
private:
bool someCondition() { /*...*/ }
}
create
/ destroy
方法也可以是A
基类的静态方法,但由于需要前向声明,它会变得有点复杂。另外,作为替代方案,A1
和A2
构造函数可以保持受保护,AFactory
成为A1
和A2
的朋友。
受保护的继承主类? 私有继承的主类?
Main
课程是什么意思?在任何情况下,非公共继承与聚合非常相似,因此如果没有非常具体的原因,聚合应该优先于私有/受保护的继承。