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
}
我有两个问题,第一个是我采用的继承方式正确吗?第二个是,正如我所评论的那样,在手动初始化过程中编译器为什么能看到数据来自于A::B而在初始化列表中却看不到呢?它们不应该在同一作用域吗?非常感谢。 编辑1: 所以如果类C::D(foo)没有直接从A::B(foo)继承而来,但是C从A继承,我的理解是,由于C继承了A及其所有public字段,包括其内部类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,编译器会不会感到困惑?因为在作用域中有两个同名的构造函数?或者它会选择调用“最近”的一个,比如C:foo?而不是沿着继承链向上爬?非常感谢。