6

私は通常、コードが正常に機能するために必要なメソッドに純粋仮想関数を使用します。したがって、私がインターフェイスを作成し、他のユーザーが派生クラスを実装します。派生クラスにはこれらの仮想関数のみがパブリックとして含まれていますが、追加のメソッドはコードで呼び出されないため、プライベートとして実装する必要があります。これが OOP の優れた実践と見なされるかどうかはわかりません (設計パターンはありますか?)。とにかく、私の質問は: ユーザーは純粋な仮想関数をオーバーロードできますか?

すなわち

class Base
{
public:
 Base();
 virtual ~Base();
 virtual void foo(int,double)=0;
};

class Derived:
public Base
{
 private:
  // methods
 public:
 Derived();
 virtual ~Derived();
 virtual void foo(int, double, double); //this doesn't work
 };

解決策は次のとおりです。

 virtual void foo(int,double,double=0)=0;

基本クラスですが、非常に限られています。についてどう思いますか?

4

6 に答える 6

4

できません。

Baseオブジェクトを指すポインタがあるとしDerivedます。ポインターをBase持っていると、のインターフェイスにのみ「アクセス」できBaseます(ポインターにキャストしない限りDerived、これは必要なものではありません)。

于 2013-04-05T06:55:38.153 に答える
3

オーバーロードされた関数は、単に別の関数と同じ名前を持つ関数ですが、異なるパラメーターのセットを受け入れます。つまり、別の関数です。1 つ以上のオーバーロードされた関数が仮想であるかどうかとは関係ありません。

あなたが提示した例では、ユーザーは純粋仮想関数をオーバーロードできると思いますが、それをオーバーライドした後でのみです。また、基本クラスから関数に直接アクセスすることはできませんでした。基本クラスのポインターを派生クラスのポインターにキャストする必要があります。

于 2013-04-05T06:58:09.003 に答える
0

関数のシグネチャが異なるため、オーバーライドされません。関数をオーバーライドするポリモーフィズム ルールによると、関数のシグネチャと型は同じである必要があります。

この場合、これらの機能は異なります。仮想ボイド foo(int,double)=0; virtual void foo(int, double, double);

于 2014-02-13T11:36:57.430 に答える