ページ 11

派生クラスなのに”抽象クラス”になる

Posted: 2012年7月16日(月) 09:34
by ミーン
まずは以下のコードをご覧ください。

コード:

// インターフェースクラス
class InterfaceClass
{

	public:

		virtual void Porygon() = 0;
		virtual void Oshawott() = 0
		virtual void Galvantula() = 0;
		virtual ~InterfaceClass() = 0;

};

// 派生クラス
class ExtendedClass : public InterfaceClass
{

	public:

		void Porygon() { }
		void Oshawott() { }
		void Galvantula() { }
		~ExtendedClass() { }

};
このようなクラスがあったとして、

コード:

ExtendedClass exCls;
とすると抽象クラス型 "ExtendedClass" のオブジェクトは使用できませんというエラーが表示されます。
インターフェースクラスで宣言された全てのメソッドを派生クラスで定義しているのですが…。
何故でしょうか?

Re: 派生クラスなのに”抽象クラス”になる

Posted: 2012年7月16日(月) 09:51
by h2so5
「純粋仮想デストラクタ」について調べてみてください。

Re: 派生クラスなのに”抽象クラス”になる

Posted: 2012年7月16日(月) 10:37
by nullptr
「抽象クラス」と出たらまず純仮想関数の定義が抜けていると思ったほうがいいです。今回は純仮想デストラクタです。

Re: 派生クラスなのに”抽象クラス”になる

Posted: 2012年7月17日(火) 20:20
by ミーン
返信が遅くなってしまい申し訳ありません。

>>h2so5さん
>>新月獅子さん
仰せの通り、以下のようにしていなかったのが原因でした。

コード:

class InterfaceClass
{
 
    public:
 
        virtual void Porygon() = 0;
        virtual void Oshawott() = 0
        virtual void Galvantula() = 0;

		// 仮想デストラクタの”定義”は抽象クラスでも必要なようですね
        virtual ~InterfaceClass() = 0 { ; }
 
};

// このようにしても出来るようです
/*
InterfaceClass::~InterfaceClass() { ; }
*/
 
// 派生クラス
class ExtendedClass : public InterfaceClass
{
 
    public:
 
        void Porygon() { }
        void Oshawott() { }
        void Galvantula() { }
        ~ExtendedClass() { }
 
};
これで通りました。ありがとうございました。

Re: 派生クラスなのに”抽象クラス”になる

Posted: 2012年7月18日(水) 06:40
by nullptr
些細な事ですが
>// 仮想デストラクタの”定義”は抽象クラスでも必要なようですね
純仮想デストラクタですね