在创建嵌套类的实例时,是否也要创建嵌套类的实例?

时间:2015-11-28 09:19:25

标签: c++ oop c++11 inheritance

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

如果没有,那么孩子只能访问父母的静态公共(和受保护)功能吗?

例如:

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();
}

4 个答案:

答案 0 :(得分:2)

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

请注意,由于是内部班级,b可以访问a的非公开会员。

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

答案 1 :(得分:2)

两点:

  1. 解决你的问题标题,答案是肯定的,派生类总是包含其基类的子对象。由于“is-a”关系,我也更喜欢父类和子类的基类和派生类。派生类实例是基类实例,但子节点不是父节点。
  2. 解决您的问题正文,您没有父/子或基础/派生类。你在那里的构造有一个嵌套在其他类中的类。这是完全不同的东西。基本上,这只是创建了第二个类,其名称嵌套在另一个类的“命名空间”中。但是,创建嵌套类的实例不会创建嵌套类的实例。

答案 2 :(得分:1)

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

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

所以在这个陈述中

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

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

答案 3 :(得分:-1)

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

class a {  
        public:
           void bar();
        }

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