14

これらのクラスがあるとします:

class Base
{
    public:

        class Foo { ... };

        ...
};

次に、別のクラスがベースから派生します。

class Derived : public Base
{
    // no mention or redefinition of nested class "Foo" anywhere in "Derived"
};

これは、 が別個のものになったということですかDerived::Foo、それとも とDerived::Fooまったく同じBase::Fooですか?

このシナリオにはひねりがありますDerived::Foo。このシナリオでキャッチされるでしょうか:

catch ( const Base::Foo &ex )
{
    // would this also catch an instance of Derived::Foo?
}
4

2 に答える 2

3

Base::FooDerived::Fooクラスは単なる複合型(ドラフトC++ 標準セクションから) であり、基本クラスから継承された型が派生クラスで異なる型であるとは予想されません。たとえば、含まれている場合:3.9.2Base

typedef int newType1 ;

Derived再宣言しない限り、andは同じnewType1であると予想され、ネストされたクラスも同じです。草案の標準セクションを参照すると、クラスメンバーのパラグラフ1は次のように述べています(強調鉱山):Base::newType1Derived::newType19.2

[...]クラスのメンバーは、データ メンバー、メンバー関数 (9.3)、ネストされた型、および列挙子です。データ メンバーとメンバー関数は、静的または非静的です。9.4 を参照してください。ネストされた型は、クラス (9.1、9.7) およびクラスで定義された列挙型 (7.2)、および typedef 宣言 (7.1.3) を使用してメンバーとして宣言された任意の型です。

これは、直感的に入れ子になったクラスが単なる(およびメンバー) であることを確認します。完全を期すために、9.7上記で参照されているセクションは入れ子になったクラスのセクションであり、セクション10 派生クラスの段落1から次のことがわかります。

[...]派生クラスで再宣言されない限り、基本クラスのメンバーも派生クラスのメンバーと見なされます。[...]

それらは同じタイプであるため、キャッチは正常に機能します。

于 2013-10-23T03:05:23.227 に答える