class parent {
public:
class child; // Is this declaration inherited by parent::child class?
int getval() const;
protected:
parent(int val);
int val;
};
parent::parent(int val) : val(val) {}
int parent::getval() const {
return val;
}
class parent::child : public parent {
public:
child();
};
parent::child::child() : parent(10) {}
int main(){
std::cout << parent::child().getval() << std::endl; // prints out 10 indeed!
return 0;
}
不允许使用parent
的实例。 child
在parent
的范围内,可作为parent::child
访问。这段代码编译得很好,尽管我担心它可能有问题。由于child
继承自parent
,因此它也继承了child
声明,不是吗?总的来说,可以在child
类的范围内声明parent
类吗?
答案 0 :(得分:1)
使用child
作为parent
的嵌套类型是一个坏主意。
在您所说的评论中
例如,我的班级apple继承自
fruit
。我希望以fruit::apple
的身份访问它,因为仅apple
太令人困惑(嗯,apple
是一家公司吗?已经很困惑)。child
在parent
的范围内。有什么理由是个坏主意吗?还是我应该怎么做?
现在,您要添加orange
作为fruit
的子类型。为了与apple
保持一致,还必须将orange
嵌套为fruit
。每当需要新的fruit
子类型时,就必须修改fruit
。这违反了面向对象设计的最重要原则之一-The Open Closed Principle。
一种更好的区分苹果和苹果公司的方法是使用名称空间。
namespace products
{
class fruit {};
class apple : public fruit {};
}
namespace organizations
{
class company {};
class apple : public company {};
}
现在,您可以使用products::apple
来引用水果,organizations::apple
来引用公司。