2015-11-28 70 views
0

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

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

例如:

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

你不能完全改变这个问题。我正在恢复您的修改。 – juanchopanza

+0

我没有完全改变它......我添加了一个我最初想问的问题,是否应该提出另一个问题? @juanchopanza – shinzou

+0

是的,你应该提出另一个问题。你不应该在一个问题中提出两个问题。 – juanchopanza

回答

2

两点:

  1. Adressing你的问题题,答案是肯定的,派生类中总是包含其基类(ES)的子对象。由于“is-a”关系,我还希望基类和派生类超过父类和子类。派生类实例是基类实例,但子项不是父项。
  2. 解决你的问题主体,你没有父/子或基类/派生类。你在那里有一个嵌套在其他类中的类。这是完全不同的东西。基本上,这只是创建第二个类的名字嵌套在其他类的“名称空间”中。虽然创建嵌套类的实例不会创建嵌套类的实例。
2

的“父/子”术语通常用来描述继承的关系,你的代码没有。考虑到这一点,b没有任何数据成员或类型为a的基类,所以答案是否定的。没有创建类型为a的对象。

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

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

所以它可以访问私有成员,即使我给了它'a'的另一个实例(不是在函数中创建的)?你是什​​么意思?在我的代码中不是'a'的''孩子吗? – shinzou

+0

@kuhaku我不认为C++有一个父子的官方定义。但根据常用的定义,“b”不是“a”的孩子。 – juanchopanza

+0

@kuhaku如果成员是非静态的,您需要一个对象才能访问它们。 – juanchopanza

1

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

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

在此声明

所以

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

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

-1

B类给出的新参数将是与“a”一样的任何附加参数。

class a { 
     public: 
      void bar(); 
     } 

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