关于c ++:派生类中的方法多于基类

More methods in derived classes than base class

在这个派生类的例子中,我想问一个关于编程风格的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A
{
public:
   virtual foo1()=0;
}

class B: public A
{
 public:
  virtual foo1();
  virtual foo2();
 }

class C: public A
{
 public:
  virtual foo1();
 }

int main() {
 B mB();
 C mC();
 mB.foo2() //OK!
 mC.foo2() // obviously, it is not correct
return 0;}

因此,派生类的公共方法应该小于或等于抽象基类吗?

如果派生类需要更多的方法,这些方法应该是私有的吗?


派生类几乎总是拥有比基类更多的公共函数。这就是继承的要点:您可以定义一个抽象的基类,它只概述变量的基本行为,然后派生类可以针对特定情况扩展这个基本行为。

继承类始终是基类的专用化。它实现更具体的功能(通常更多的功能一起实现)。在您的例子中,您期望两个不同的专门化在基类定义的行为之外以相同的方式运行。(foo2A中没有定义)。这就是问题所在。如果需要在A之外定义公共行为,解决方案是创建一个中间类。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Intermediate : public A
{
public:
    virtual foo1()=0;
    virtual foo2()=0;
}

class B: public Intermediate
{
public:
    virtual foo1();
    virtual foo2();
}

现在,任何可以实现foo2的类都应该扩展Intermediate,任何需要foo2功能的函数都应该请求一个至少类型为Intermediate的变量。


在我处理过的几乎所有项目中,我们都有比派生类功能更少的基类——在极端情况下,基类甚至可能几乎没有功能,但派生类有几十个函数和半打成员变量。

这正是派生类要做的。

显然,您需要知道您拥有什么类型的派生类,并且只有在派生类"额外"函数可用时才使用它们。


派生类必须至少实现基类中的所有抽象方法。这是最小值。如果您添加了其他方法、成员或其他由您决定的方法。但是,从类中派生并不添加任何内容是不明智的,因为这不是继承的目的(至少是IS-A关系)。如果你选择private inheritance,可能会有所不同。


这个类结构没有任何问题。派生类拥有比父类更多的方法没有什么错——这很常见。行mC.foo2();是错误的,这不是类的错误。