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

Why cant we create an object of base class in a derived class function if base class constructor is protected

本文关键字:基类 派生 类函数 创建 对象 不能 为什么 构造函数 保护 如果 我们      更新时间:2023-10-16
如果

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

考虑示例代码

class Base {
protected:
     Base() {}
};
class Derived:public Base {
public:
     void func() {
        Base obj;
     }
};

上面的代码将如何说明编译错误,指出 Base 的构造函数受到保护。但是,如果我在 main 中创建一个派生类的对象,则会调用基类的构造函数(我知道它由派生类构造函数在内部调用),这意味着基类构造函数可以从派生类函数调用。那为什么我们不能在派生类函数中创建基类对象...?

还有一件事....除了在同一类的方法中(就像我们在创建 Singleton 时所做的那样)之外,还有其他方法可以实例化其构造函数受保护的类的对象吗?

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

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

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

在不删除受保护说明符的情况下创建Base实例的唯一方法是创建一个Derived实例,该实例"是"Base的实例。或者创建另一个派生类,该类不会向"Base"添加任何重写的行为。