当创建嵌套类的实例时,是否也是正在生成的嵌套类的一个实例

When creating an instance of a nested class, is an instance of the nesting class being made too?

本文关键字:实例 嵌套 一个 创建 是否      更新时间:2023-10-16

创建嵌套类的实例时,是否也生成了嵌套类的一个实例?

如果不是,则子级只能访问父级的静态公共(和受保护的)功能?

例如:

class a {
public:
    void baz();
    class b {
    public:
        void foo();
    };
};
int main(){ 
    a::b bar; //is an instance of a being made too?
    bar.foo();
}

两点:

  1. 根据问题标题,答案是肯定的,派生类总是包含其基类的子对象。我也更喜欢基类和派生类,而不是父类和子类,因为"is-a"关系。派生类实例是基类实例,但子实例不是父实例
  2. 针对你的问题主体,你没有父类/子类或基类/派生类。你所拥有的构造是一个嵌套在其他类中的类。这完全不同。基本上,这只是创建了第二个类,该类的名称嵌套在另一个类的"命名空间"中。不过,创建嵌套类的实例并不会创建嵌套类实例

"父/子"术语通常用于描述继承关系,而您的代码没有这些关系。请记住,b没有任何a类型的数据成员或基类,所以答案是否定的。没有创建a类型的对象。

注意,由于是内部类,b可以访问a的非公共成员。

void a::b::foo() {
  a obj;
  obj.some_private_member(); // OK
}

类别b是类别a的成员。它是一个嵌套类型声明。该嵌套类型的两个子对象都没有在类a中声明。因此,您可能不会调用非静态成员函数foo,因为需要类b的实例。

另一方面,嵌套类b的定义不包括类a的子对象。任何类都只有那些在类定义中声明的成员。

所以在这个声明中

a::b bar; //is an instance of a being made too?

创建了一个类b的实例,根据其定义,该实例只有一个成员-成员函数foo

类b中给出的新参数将与"a"以及任何其他参数相同。

class a {  
        public:
           void bar();
        }
       class b : public a                            
       {
         public:
           void foo();
       }