父类范围内的子类

时间:2018-08-05 15:27:03

标签: c++ oop parent-child

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的实例。 childparent的范围内,可作为parent::child访问。这段代码编译得很好,尽管我担心它可能有问题。由于child继承自parent,因此它也继承了child声明,不是吗?总的来说,可以在child类的范围内声明parent类吗?

1 个答案:

答案 0 :(得分:1)

使用child作为parent的嵌套类型是一个坏主意。

在您所说的评论中

  

例如,我的班级apple继承自fruit。我希望以fruit::apple的身份访问它,因为仅apple太令人困惑(嗯,apple是一家公司吗?已经很困惑)。 childparent的范围内。有什么理由是个坏主意吗?还是我应该怎么做?

现在,您要添加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来引用公司。