首页 文章

派生类中的方法多于基类

提问于
浏览
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 回答

  • 0

    这个类结构没有错 . 派生类有比父类更多的方法没有任何问题 - 它是相当普遍的 . mC.foo2(); 行是错的,这不是类的错 .

  • 2

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

    继承的类始终是基类的特化 . 它实现了更具体的功能(通常还有更多的功能) . 在你're example, you'期望两个不同的特化在表示基类定义的行为之外的相同方式 . ( 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 的函数都应该要求一个至少类型为 Intermediate 的变量 .

  • 0

    派生类必须至少从基类实现 ALL 抽象方法 . 这是最低限度 . 如果您确实添加了其他方法,成员或其他任何由您决定的 .
    但是从类中派生并且不添加任何东西并不是很聪明,因为这不是继承的目的(至少 IS-A -relationships) . 如果你去 private inheritance ,它可能会有所不同 .

  • 0

    在我所参与的几乎所有项目中,我们的基类具有比派生类更少的功能 - 在极端情况下,基类甚至可能几乎没有功能,但派生类有几十个函数和六个成员变量 .

    这正是派生类的意图 .

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

相关问题