2016-05-29 11 views
-2

質問があります: 抽象クラスから派生したクラスでnon_virtual関数を実装するにはどうすればよいですか?たとえば:C++多態性と非仮想関数

class A { 
    public: 
    virtual void foo() = 0; 
}; 

class B : public A{ 
    public: 
     virtual void foo() { 
      /* some code */ 
     } 
     //B function 
     void Bfoo(){ 
      /* some code */ 
     } 
}; 

int main(){ 
    A* a = new B; 
    a -> foo(); 
    a -> Bfoo(); 
    return 0; 
} 

グラム++取得します:多型を使用し、非仮想関数を使用する方法は

error: ‘class A’ has no member named ‘Bfoo’ 
a -> Bfoo(); 

ありますか?

EDIT

私はエラーが出るように、AはBfoo()機能を持っていないことを知っています。私はこの疑問を尋ねました。なぜなら、いつ有用なポリモーフィズムがいつ使われるのか分からなかったからです。

私の答えは次のようになります。

私の派生クラスは、すべて同じ機能を持っており、一つの共通の基本クラスから派生したときに、私はポリモーフィズムを使用しています。

しかし、クラスに他の関数がある場合、多型はなくなりますか?

+0

あなたは何が起こると思いますか? 'A'にはそのようなメソッドはありません。なぜ、あなたが' A'へのポインタから呼び出すことができないのかは明らかです。これはXYの問題のように聞こえるので、達成しようとしていることを説明してください。 – Rotem

+0

'((B *)a) - > Bfoo()'? –

+0

@PatrickRobertsこの修正は機能しますが、多型の意味が強すぎます。 '((B *)a) - > Bfoo()'を使うと、 'A * b = new B'の代わりに' B * a = new B'を使うことができます。 – linofex

答えて

0

ポインターaと機能Bfoo()を使用する場合は、virtualとしてclass Aに機能Bfoo()を追加する必要があります。

私はEDIT

(質問変更後)の定義の知識が必要である

class A { 
    public: 
    virtual void foo() = 0; 
    virtual void Bfoo() {} //this line is necessary 
}; 

を意味します。ここでcplusplus.com

仮想メンバー
仮想メンバーからの仮想メンバーの定義は、参照を介して呼び出すの特性を維持しながら、派生クラスで再定義することができるメンバ関数です。関数が仮想になる構文は、その宣言にvirtualキーワードを先行させることです。

多型仮想関数/メンバーの定義についてresourceを参照してください。

+0

こんにちは、私は 'クラスB'を派生クラスとして持っていればこの解決策は正しいかもしれませんが、'クラスC:公共A'もどうでしょうか?私は空の '{} 'で' Bfoo() 'を実装すべきですが、私のプログラムのインターフェースは悪く、 は全く読めません。 – linofex

0

派生クラスは非仮想関数を追加できますが、派生クラスへのポインタまたは参照からと呼び出す必要があります。

多形性のポイントは、呼び出し元コードが、それが動作している変数がどのような具体的なクラスであるかを気にする必要がないことです。

通常、このようなメソッドは、クラスのプライベート実装の一部であり、パブリックインターフェイスの一部ではありません。派生クラス内の非仮想パブリック・フェーシング・メソッドは、呼び出しコードが暗黙的にクラスの具体的な型を認識するように強制します。

もちろん、A*B*にキャストすることもできますが、この種の多型の点では問題になります。あなたがしようとしていることの具体例がなければ、より具体的なアドバイスをするのは難しいです。

+0

こんにちは、ありがとう、返信ありがとうございます。現時点では例がありません。私は運動を解決しようとすると、多形性について考えるときに質問が上がります。多分、私はこの(重要な)議論をもっと研究し、多型のポイントをよく理解しなければならないでしょう。 – linofex