模範になってない解答 をC++で。
なんかここんとこC#ばっかやってます。
C#ってばちょこちょこっとお試し書くのに楽なもんだから、
秀丸で書いてコマンドラインで csc 使ってばっか。
たまにゃC++で遊んであげよぉ。
#include <iostream>
#include <string>
using namespace std;
// 鳴くもんインタフェース
class ISound {
public:
virtual ~ISound() {}
virtual void SetCount(int n) =0;
virtual void Sound() const =0;
};
// 鳴きますぃーん。
// おたくのにゃんこはもっと可愛く鳴くでしょう
// オリジナルのらぶりー鳴きますぃーんを作ってあげてね(はあと
class SoundImpl : virtual public ISound {
private:
string sound_;
int count_;
public:
SoundImpl(string s) : sound_(s), count_(1) {}
virtual void SetCount(int n) { count_ = n; }
virtual void Sound() const {
for ( int i = 0; i < count_; ++i )
cout << sound_;
endl(cout);
}
};
// Animalそれ自体は鳴き方を知らず、
// 導出クラスより受け渡されるISoundに移譲する。
class Animal : virtual public ISound {
private:
ISound* sound_;
protected:
Animal(ISound* s) { sound_ = s; }
public:
virtual ~Animal() { delete sound_; }
virtual void SetCount(int n) { sound_->SetCount(n); }
virtual void Sound() const { sound_->Sound(); }
};
class Dog : public Animal
{ public: Dog() : Animal(new SoundImpl("わん")) {} };
class Cat : public Animal
{ public: Cat() : Animal(new SoundImpl("にゃー")) {} };
int main() {
Animal* animal;
animal = new Dog();
animal->Sound();
animal->SetCount(3);
animal->Sound();
delete animal;
animal = new Cat();
animal->Sound();
delete animal;
}