1

在这种派生类的情况下,我想问一个关于编程风格的问题:

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;}

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

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

4

4 回答 4

2

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

继承的类始终是基类的特化。它实现了更具体的功能(通常是更多的功能)。在您的示例中,您期望两个不同的专业化在基类定义的行为之外以相同的方式表现。(foo2未在 中定义A)。这就是问题所在。如果您需要在 之外定义常见行为A,则解决方案是创建一个中间类。

class Intermediate : public A
{
public:
    virtual foo1()=0;
    virtual foo2()=0;
}

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

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

于 2013-03-13T14:12:48.737 回答
0

这种类结构没有任何问题。派生类拥有比父类更多的方法并没有错——这很常见。这条线mC.foo2();是错误的,这不是班级的错。

于 2013-03-13T14:09:13.057 回答
0

派生类必须至少实现基类的所有抽象方法。这是最低限度。如果您确实添加了其他方法、成员或其他任何内容,则取决于您。
但是从类派生并且不添加任何内容并不是很聪明,因为这不是继承的目的(至少是IS-A-关系)。如果你去,private inheritance它可能会有所不同。

于 2013-03-13T14:09:36.537 回答
0

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

这正是派生类的本意。

显然,您需要知道您拥有什么样的派生类,并且只有在派生类可用时才使用派生类的“额外”功能。

于 2013-03-13T14:12:10.317 回答