请原谅我,如果问题是重复......我无法得到令人满意的答案,所以以我的方式发布任务......
考虑示例代码
class Base {
protected:
Base() {}
};
class Derived:public Base {
public:
void func() {
Base obj;
}
};
上面的代码将提示编译错误,说Base的构造函数受到保护。 但是如果我在main中创建了一个Object of Derived类,那么Base类的构造函数就会被调用(我知道它是由Derived类构造函数在内部调用的),这意味着可以从Derived类函数调用Base类构造函数。 那么为什么我们不能在派生类函数中创建一个Base类对象......?
还有一件事....有没有其他方法来实例化一个类的对象,其构造函数在protected中,而不是在同一个类的方法中(就像我们在创建Singleton时那样)...?< / p>
答案 0 :(得分:2)
访问类型protected
仅授予对从父类继承的“您自己的”成员的访问权限。与...不同Java,C ++对该概念有相当严格的解释,允许您只访问同一实例的继承成员。
通过使用构造函数,您在技术上试图访问另一个实例的非公开实现细节,这是禁止的。
答案 1 :(得分:2)
错误是认为您有效地尝试访问受保护的基类成员。你不是那样做的。您正在尝试使用标记为protected的构造函数创建类的实例。通过将构造函数标记为受保护,您特别禁止构造该类的实例。这只能在派生类的构造函数中实现。这就是为什么你发现它在main()
程序中工作的原因。
创建Base
实例而不删除受保护的说明符的唯一方法是创建Derived
的实例,其中“是”Base的实例。或者创建另一个不向“Base”添加任何重写行为的派生类。