我有一个(保证树形)级联类,如
class rock_bottom {
...
virtual foo() = 0;
};
class A : rock_bottom {...}
class intermediate: rock_bottom {...}
class B : intermediate {...}
class higher_up {...}
class C : higher_up {...}
我想在字母A,B,C中实现foo()。我需要在哪里声明foo? (虚拟?纯粹?)我是否需要在中间层中间和更高层的(平凡)实现?
答案 0 :(得分:2)
<强>问题:强>
我想在字母A,B,C中实现foo()。我需要在哪里声明
foo
? (虚拟?纯粹?)
<强>答案:强>
需要反过来提出这个问题。在哪个基类中创建接口foo
是有意义的。我们来看一些你可能在申请中找到的课程。
struct Shape {};
struct Rectangle : public Shape {};
struct Square : public Rectangle {};
struct Ellipse : public Shape {};
struct Circle : public Ellipse {};
所有Shape
能够返回其区域和周边是有道理的。因此,您将它们作为virtual
中的Shape
成员函数。
struct Shape
{
virtual double area() const = 0;
virtual double perimeter() const = 0;
};
在创建Shape
子类型的实例之前,必须先实现它们。
如果您希望能够创建Rectangle
,那么这些函数必须在Rectangle
中实现,因为没有其他中间类。
如果您希望能够创建Square
,则必须在Rectangle
,Square
或两者中实施这些功能。
同样,如果您希望能够创建Ellipse
,那么这些函数必须在Ellipse
中实现,因为没有其他中间类。
如果您希望能够创建Circle
,则必须在Ellipse
,Circle
或两者中实施这些功能。
但是,只有Rectangle
具有长度和宽度。只有Ellipse
具有主半径和小半径。在Shape
中添加虚拟成员函数以返回这些值是没有意义的。
<强>问题:强>
我是否需要在中间层middle和up_up中实现(平凡)实现?
<强>答案:强>
不,你没有。上一个问题的答案应该澄清更多。
答案 1 :(得分:1)
每个覆盖都需要在实现它的类中声明;在您的情况下,A
,B
和C
,因为您说每个都会提供覆盖。
没有必要在任何中级课程中声明它,假设你很高兴他们保持抽象。它们从rock_bottom
继承了纯函数,并且没有必要用另一个纯函数覆盖它。