仮想関数の宣言

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
よつどもえ

仮想関数の宣言

#1

投稿記事 by よつどもえ » 15年前

(この記事は管理人が復元しました)

#include<iostream>
using namespace std;

class Musician{
public:
virtual void play(); //仮想関数
int experience(); //非仮想関数
virtual int practice(int how_long); //仮想関数
};

class BrassMusician:public Musician{
public:
//play()は宣言されない、Musicianバージョンを継承する
};
class Trumpeter:public BrassMusician{
public:
virtual void play(); //play()は再宣言される、そのため上書き使用をしなければならない
}; //再宣言のvirtualは任意

void Trumpeter::play() {/*・・・*/} //これを宣言したため、定義しなければならない

class Musician{
public:
virtual void setVolume(int value);
};
class Trumpeter:public Musician{
public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
};

int main(){
Musician *pm=new Trumpeter;
pm->setVolume(5); //問題:pmはTrumpeterインスタンスを指しているが、Musician::setVolume()を起動
delete pm;
}

プログラミングの授業でこのプログラムを通そうとしたのですが、
次のようなコンパイルエラーが出ました。
Musician : class 型の再定義
Musician の宣言を確認してください。
Trumpeter : class 型の再定義
Trumpeter の宣言を確認してください。
認識できない型 Trumpeter が使われています。
直前のエラーを修復できません。コンパイルを中止します。

ある程度できているソースコードに手を加えてプログラムを完成させるという
授業なのですが、これらのコンパイルエラーがわかりません。
どなたか解答お願いします。

Poco

Re:仮想関数の宣言

#2

投稿記事 by Poco » 15年前

Musicianというクラスが2つ定義されてますよ。
一つにまとめることはできないのですか?

よつどもえ

Re:仮想関数の宣言

#3

投稿記事 by よつどもえ » 15年前

ありがとうございます。
自分でも少しいじってエラーはほとんどなくなりましたが、

#include<iostream>
using namespace std;

class Musician{
public:
virtual void play(); //仮想関数
int experience(); //非仮想関数
virtual int practice(int how_long); //仮想関数
virtual void setVolume(int value);
};

class BrassMusician:public Musician{
public:
//play()は宣言されない、Musicianバージョンを継承する
};
class Trumpeter:public BrassMusician{
public:
virtual void play(); //play()は再宣言される、そのため上書き使用をしなければならない
}; //再宣言の"virtual"は任意

void Trumpeter::play() {/*・・・*/} //これを宣言したため、定義しなければならない

public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている

/*class Trumpeter:public Musician{
public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
};*/

int main(){
Musician *pm=new Trumpeter;
pm->setVolume(5); //問題:pmはTrumpeterインスタンスを指しているが、Musician::setVolume()を起動
delete pm;
}

こう直した時に下のpublicの構文エラーが出ます。
public:
void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
どうすれば直るでしょうか?
教えてください。

Poco

Re:仮想関数の宣言

#4

投稿記事 by Poco » 15年前

> こう直した時に下のpublicの構文エラーが出ます。
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?

仮引数名にlongは使用できません(C++のキーワードなので)。
Musicianクラスと同じvalueにしてはどうですか?

よつどもえ

Re:仮想関数の宣言

#5

投稿記事 by よつどもえ » 15年前

中をvalueに変えてもpublic:の構文エラーが出てしまいます。

Poco

Re:仮想関数の宣言

#6

投稿記事 by Poco » 15年前

> こう直した時に下のpublicの構文エラーが出ます。
> public:
> void setVolume(int long); //誤り:Musician::setVolume()を上書きしたいが、パラメータの型が違っている
> どうすれば直るでしょうか?

クラスTrumpeterの定義の中に入れてください。

class Trumpeter:public BrassMusician{
/*ここに入れる*/
};

よつどもえ

Re:仮想関数の宣言

#7

投稿記事 by よつどもえ » 15年前

すいません、返事が遅れました。

ありがとうございました。
Trumpererのクラス定義に入れたらエラーがなくなりました。

よつどもえ

Re:仮想関数の宣言

#8

投稿記事 by よつどもえ » 15年前

。。

閉鎖

“C言語何でも質問掲示板” へ戻る