クラスCがクラスAからその仮想関数を継承し、クラスD(クラスCのネストされたクラス)がクラスB(クラスAのネストされたクラス)からそのデータフィールドを継承するようにしたかったのですが、これが私が持っているものです。
file1.h
class A{
public:
virtual void foo()=0;
class B{
public:
int data;
};
};
file2.h
class C : public A{
public:
class D : public A::B{
};
};
file2.cpp
void C::foo(){//code}
C::D::D():data(0){//Bad initialization list, error being data is not a member of C::D even it should inherits from its base class
data = 0; //good! compiler can see data is a member of A::B,and C::D inherits from it
}
私は2つの質問を受けました。最初の質問は、この種の継承を実現するために私が正しい方法で行っていることです。第二に、私がコメントしたように、なぜコンパイラは手動初期化プロセスでA :: Bからのデータを見ることができますが、初期化リストにはありませんか?それらは同じスコープにあるべきではありませんか?どうもありがとうございます
Edit1:
したがって、クラスC :: D(foo)がA :: B(foo)を直接継承しないが、CはAを継承する場合、CはAと、その内部クラスAを含むすべてのパブリックフィールドを継承するため、私の認識では:: B(foo)、D(foo)はA :: B(foo)とまったく同じ名前で、このようにCの内部クラスです。つまり、両方の内部クラスにfooを使用します。
class A{
public:
class foo{
public:
int data;
};
};
class C : public A{
public:
class foo{
};
};
C :: fooを直接呼び出すと、コンパイラが混乱しますか?スコープにその名前のコンストラクターが2つあるので?または、「最も近い」ものを呼び出すことを選択します。たとえば、C:foo?継承チェーンを登る代わりに?どうもありがとうございます