2017-09-23 17 views
-2

は、私は(機能を作りたい派生クラスの純粋仮想関数を他の純粋仮想関数として実装するにはどうすればよいですか?

class A 
{ 
protected: 
virtual void function() =0; 
} 

class B: public class A 
{ 
protected: 
virtual void function() { blah blah blah }; 
} 

)、クラスB、純粋仮想関数で考えてみましょう。つまり、Bの派生クラスはfunction()の別の実装を作成する必要があります。このタスクを実行するにはどうすればよいですか?

+6

?何を試しましたか? –

答えて

-1

すべての基本クラスの純粋仮想メソッドを実装していない任意の派生クラスは抽象クラスであり、インスタンス化できません。したがって、後者を実装する必要があります。

  • また継承クラス宣言時キーワードclassを削除:的に

    class B: public class A 
    

を:

class B: public A { 

}; 

またセミコロンが冗長でないのでの各端部に追加クラス宣言。

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

    class B: public A { 
     public: 
      virtual void function()= 0; // B is an ADT due to this pure method function. 
    }; 

    void B::function() { 
      std::cout << "B::function()" << std::endl; 
    }; 

    class C : public B{ 
     public: 
      void function(){ 
        B::function(); 
        std::cout << "C::funtion()" << std::endl; 
      } 
    }; 

    int main(){ 

    // A aObj; // error 
    // B bObj; // error 
     C cObj; // correct 
     cObj.function(); 

     return 0; 
    } 
  • 私は方法function純粋な、それはそれをインスタンス化することはできませんので、必ず、クラスBで見ることができるように。私はまた、派生クラスのオブジェクトが機能するためにchain upできるように定義を追加します。

また、ADTも行うことができます:あなたを停止している何

class B : public A{ 
    // it is sufficient to make it ADT by not implementing the base pure method function. 
}; 
+0

すぐに純粋仮想関数を定義することはできません... – Rakete1111

+0

@ Rakete1111:あなたの証明は何ですか? - 連鎖はどうですか? – Raindrop7

+0

言語はそれを許さない([ref](http://eel.is/c++draft/class#mem-11.sentence-3))。これは "連鎖"とは無関係で、 'virtual void f()= 0 {}'はC++では有効ではありません。 – Rakete1111

関連する問題