如果基类构造函数受到保护,为什么我们不能在派生类函数中创建基类对象

时间:2015-01-02 09:01:30

标签: c++ constructor

请原谅我,如果问题是重复......我无法得到令人满意的答案,所以以我的方式发布任务......

考虑示例代码

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>

2 个答案:

答案 0 :(得分:2)

访问类型protected仅授予对从父类继承的“您自己的”成员的访问权限。与...不同Java,C ++对该概念有相当严格的解释,允许您只访问同一实例的继承成员。

通过使用构造函数,您在技术上试图访问另一个实例的非公开实现细节,这是禁止的。

答案 1 :(得分:2)

错误是认为您有效地尝试访问受保护的基类成员。你不是那样做的。您正在尝试使用标记为protected的构造函数创建类的实例。通过将构造函数标记为受保护,您特别禁止构造该类的实例。这只能在派生类的构造函数中实现。这就是为什么你发现它在main()程序中工作的原因。

创建Base实例而不删除受保护的说明符的唯一方法是创建Derived的实例,其中“是”Base的实例。或者创建另一个不向“Base”添加任何重写行为的派生类。