[C++]純虚関数を継承

12862 ワード

// LISTING 12.10 - Deriving Abstract Classes from Other Abstract Classes
#include <iostream>
using namespace std;

enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown } ;

class Animal // common base to both Mammal and Fish
{
public:
Animal(int);
virtual ~Animal() { cout << "Animal destructor...
"; }
virtual int GetAge() const { return itsAge; }
virtual void SetAge(int age) { itsAge = age; }
virtual void Sleep() const = 0;
virtual void Eat() const = 0;
virtual void Reproduce() const = 0;
virtual void Move() const = 0;
virtual void Speak() const = 0;
private:
int itsAge;
};

Animal::Animal(int age):
itsAge(age)
{
cout << "Animal constructor...
";
}

class Mammal : public Animal
{
public:
Mammal(int age):Animal(age)
{ cout << "Mammal constructor...
";}
virtual ~Mammal() { cout << "Mammal destructor...
";}
virtual void Reproduce() const
{ cout << "Mammal reproduction depicted...
"; }
};

class Fish : public Animal
{
public:
Fish(int age):Animal(age)
{ cout << "Fish constructor...
";}
virtual ~Fish() {cout << "Fish destructor...
"; }
virtual void Sleep() const { cout << "fish snoring...
"; }
virtual void Eat() const { cout << "fish feeding...
"; }
virtual void Reproduce() const
{ cout << "fish laying eggs...
"; }
virtual void Move() const
{ cout << "fish swimming...
"; }
virtual void Speak() const { }
};

class Horse : public Mammal
{
public:
Horse(int age, COLOR color ):
Mammal(age), itsColor(color)
{ cout << "Horse constructor...
"; }
virtual ~Horse() { cout << "Horse destructor...
"; }
virtual void Speak()const { cout << "Whinny!...
"; }
virtual COLOR GetItsColor() const { return itsColor; }
virtual void Sleep() const
{ cout << "Horse snoring...
"; }
virtual void Eat() const { cout << "Horse feeding...
"; }
virtual void Move() const { cout << "Horse running...
";}

protected:
COLOR itsColor;
};

class Dog : public Mammal
{
public:
Dog(int age, COLOR color ):
Mammal(age), itsColor(color)
{ cout << "Dog constructor...
"; }
virtual ~Dog() { cout << "Dog destructor...
"; }
virtual void Speak()const { cout << "Whoof!...
"; }
virtual void Sleep() const { cout << "Dog snoring...
"; }
virtual void Eat() const { cout << "Dog eating...
"; }
virtual void Move() const { cout << "Dog running...
"; }
virtual void Reproduce() const
{ cout << "Dogs reproducing...
"; }

protected:
COLOR itsColor;
};

int main()
{
Animal *pAnimal=0;
int choice;
bool fQuit = false;

while (fQuit == false)
{
cout << "(1)Dog (2)Horse (3)Fish (0)Quit: ";
cin >> choice;

switch (choice)
{
case 1: pAnimal = new Dog(5,Brown);
break;
case 2: pAnimal = new Horse(4,Black);
break;
case 3: pAnimal = new Fish (5);
break;
default: fQuit = true;
break;
}
if (fQuit == false)
{
pAnimal->Speak();
pAnimal->Eat();
pAnimal->Reproduce();
pAnimal->Move();
pAnimal->Sleep();
delete pAnimal;
cout << endl;
}
}
return 0;
}

ここでは、哺乳類が動物を継承する、繁殖するReproduce()を非純虚関数とし、その他は依然として純虚関数を保持しているのを見るが、哺乳類の繁殖方式は同じであるため、繁殖方式を非純虚関数とすべきであり、他の関数は異なる可能性がある.Mammalには純粋な虚関数が含まれているため,これは依然として抽象クラスであり,インスタンス化できない.
 
作者:林が舞い上がる出典:http://www.cnblogs.com/zhengyuhong/本文の著作権は作者とブログ園に帰属して共有して、転載を歓迎して、しかし作者の同意を得ずに作者の情報を保留しなければならなくて、しかも文章のページの明らかな位置で原文の接続を提供します