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

派生クラスは、ほとんどの場合、基本クラスよりも多くのパブリック関数を持ちます。これが継承のポイントです。変数の基本的な動作の概要のみを示す抽象基本クラスを定義できます。その後、派生クラスは、特定の場合にこの基本的な動作を拡張できます。

継承されたクラスは、常に基本クラスの特殊化です。より具体的な機能を実装します(通常、より多くの機能をすべて一緒に実装します)。あなたの例では、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は少なくともタイプが。の変数を要求する必要がありますIntermediate

于 2013-03-13T14:12:48.737 に答える
0

私が取り組んだほぼすべてのプロジェクトで、派生クラスよりも機能が少ないベースクラスがありました-極端な場合、ベースクラスにはほとんど機能がない場合もありますが、派生クラスには数十の関数と半ダースがありますメンバー変数。

これはまさに派生クラスが行うことを意図していることです。

明らかに、あなたはあなたが持っている派生クラスの種類を知る必要があり、それらが利用可能であるときだけ派生クラスの「追加の」関数を使用します。

于 2013-03-13T14:12:10.317 に答える
0

このクラス構造に問題はありません。親クラスよりも多くのメソッドを持つ派生クラスに問題はありません。これはごく一般的なことです。行mC.foo2();が間違っているだけで、それはクラスのせいではありません。

于 2013-03-13T14:09:13.057 に答える
0

派生クラスは、基本クラスから少なくともすべての抽象メソッドを実装する必要があります。これが最小です。他のメソッド、メンバー、または何でも追加する場合は、あなた次第です。
しかし、クラスから派生させて何も追加しないのはあまり賢明ではありません。なぜなら、これは継承の目的ではないからです (少なくともIS-A-relationships)。行けばprivate inheritance違うかもしれません。

于 2013-03-13T14:09:36.537 に答える