如果基类构造函数受到保护,为什么我们不能在派生类函数中创建基类对象
Why cant we create an object of base class in a derived class function if base class constructor is protected
如果
问题是重复的,请原谅我......我无法得到一个令人满意的答案,所以以我的方式发布任务......
考虑示例代码
class Base {
protected:
Base() {}
};
class Derived:public Base {
public:
void func() {
Base obj;
}
};
上面的代码将如何说明编译错误,指出 Base 的构造函数受到保护。但是,如果我在 main 中创建一个派生类的对象,则会调用基类的构造函数(我知道它由派生类构造函数在内部调用),这意味着基类构造函数可以从派生类函数调用。那为什么我们不能在派生类函数中创建基类对象...?
还有一件事....除了在同一类的方法中(就像我们在创建 Singleton 时所做的那样)之外,还有其他方法可以实例化其构造函数受保护的类的对象吗?
访问类型protected
仅授予从父类继承的"您自己的"成员的访问权限。 与例如Java不同,C++对该概念有相当严格的解释,允许您仅访问同一实例的继承成员。
通过使用构造函数,您在技术上尝试访问另一个实例的非公共实现详细信息,这是禁止的。
一个错误是认为您正在有效地尝试访问受保护的基类成员。你没有那样做。您正在尝试创建具有标记为受保护的构造函数的类的实例。通过将构造函数标记为受保护,可以明确禁止构造该类的实例。这只能在派生类的构造函数中实现。这就是为什么您发现它可以在main()
程序中工作的原因。
在不删除受保护说明符的情况下创建Base
实例的唯一方法是创建一个Derived
实例,该实例"是"Base的实例。或者创建另一个派生类,该类不会向"Base"添加任何重写的行为。
相关文章:
- 指向基类派生类的 std::unique_ptr 的指针
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 从模板基类派生是否在派生类声明的点实例化模板
- 使从一个基类派生的类能够使用继承的受保护成员
- C++多态性访问基类派生类字段
- C++派生类的设置属性到从同一基类派生的未知类对象
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 在C++中,如何使用将保存从基类派生的任何对象的类成员
- 如何测试从依赖于外部系统的外部基类派生的类
- 如何从模板基类派生非模板类
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 从具有静态结构的基类派生
- 具有从 c++ 中的非模板基类派生的模板类的事件系统
- C++ 调用从基类派生的覆盖函数
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 如何正向声明从正向声明的模板基类派生的类
- 是否可以从 std::enable_shared_from_this 和抽象基类派生
- 多态性c++,试图访问从抽象基类派生的类的成员函数
- C++多重继承,基类派生自同一类
- 基类派生类访问-如何