多型:様々な形態
#include <iostream>
class Mammal
{
public:
Mammal():age(1) { std::cout << "Mammal constructor ...\n"; }
~Mammal() { std::cout << "Mammal destructor ...\n"; }
void move() const { std::cout << "Mammal, move one step\n"; }
virtual void speak() const { std::cout << "Mammal speak!\n"; }
protected:
int age;
};
class Dog : public Mammal
{
public:
Dog() { std::cout << "Dog constructor ...\n"; }
~Dog() { std::cout << "Dog destructor ..\n"; }
void wagTail() { std::cout << "Wagging tail ...\n"; }
void speak() const { std::cout << "Woof!\n"; }
void move() const { std::cout << "Dog moves 5 steps ...\n"; }
};
int main()
{
Mammal *pDog = new Dog;
pDog->move();
pDog->speak();
return 0;
}
移動()と呼ばれる、哺乳動物における移動を使用した場合、前記哺乳類* pDog =新しい犬、ポインタを作成するための哺乳動物の種類、そう、仮想関数話すことから、コールは犬の話すを書き換えます。
#include <iostream>
class Mammal
{
public:
Mammal():age(1) { }
~Mammal() { }
virtual void speak() const { std::cout << "Mammal speak!\n"; }
protected:
int age;
};
class Dog : public Mammal
{
public:
void speak() const { std::cout << "Woof!\n"; }
};
class Cat : public Mammal
{
public:
void speak() const { std::cout << "Meow!\n"; }
};
class Horse : public Mammal
{
public:
void speak() const { std::cout << "Whinny!\n"; }
};
class Pig : public Mammal
{
public:
void speak() const { std::cout << "Oink!\n"; }
};
int main()
{
Mammal* array[5];
Mammal* ptr;
int choice, i;
for (i = 0; i < 5; i++)
{
std::cout << "(1) dog (2) cat (3) horse (4) pig: ";
std::cin >> choice;
switch (choice)
{
case 1:
ptr = new Dog;
break;
case 2:
ptr = new Cat;
break;
case 3:
ptr = new Horse;
break;
case 4:
ptr = new Pig;
break;
default:
ptr = new Mammal;
break;
}
array[i] = ptr;
}
for (i=0; i < 5; i++)
{
array[i]->speak();
}
return 0;
}
哺乳類のポインタの配列を作成し、各要素は、哺乳動物仮想関数で話すので、派生クラス話すを呼び出すためには、そのような豚の犬...か何かのように、オブジェクトポインタの哺乳類に保存されています。
コンパイル時に、あなたはそれが話す呼び出すためにどの方法を知ることができない、作成するオブジェクトの種類がわからない、PTRオブジェクトへのポイントは、遅延バインディングと呼ばれる運用段階で決定された(新しいとダイナミックメモリに似て?)または、運用フェーズでは、静的にコンパイル段階を結合し、結合に対し、結合します。