マルチステートの実装、継承とテンプレート関数


stl,boostではほとんどのコンテナがテンプレートクラス+テンプレートアルゴリズムを採用してマルチステートを実現しています.効率が高いからです.その原因を究明し、静的コンパイル
/* 
 * File:   main.cpp
 * Author: Vicky.H
 *
 */
#include <iostream>

/**  */
class Animal {
public:

    virtual ~Animal() { };
    virtual void eat() = 0;
    virtual void sleep() = 0;
    virtual void breed() = 0;
};

/**    */
class Mammal : public Animal {
public:

    ~Mammal() {
        std::cout << "delete Mammal" << std::endl;
    }

    void eat() { }

    void sleep() { }

    void breed() {
        std::cout << "        " << std::endl;
    }

};

/**    */
class Ovipara : public Animal {
public:

    ~Ovipara() {
        std::cout << "delete Ovipara" << std::endl;
    }

    void eat() { }

    void sleep() { }

    void breed() {
        std::cout << "        " << std::endl;
    }
};

template <typename T>
void breed(T& o) {
    std::cout << "void breed(T& o)" << std::endl;
    o.breed();
}

template <typename T>
void breed(const T& o) { /**  ::      const    ,          const  */
    std::cout << "void breed(const T& o)" << std::endl;
    o.breed();
}

template <typename T>
void breed(T* p) {
    std::cout << "void breed(T* p)" << std::endl;
    p->breed();
}

template <typename T>
void breed(const T* p) {
    std::cout << "void breed(const T* p)" << std::endl;
    p->breed();
}

class A {
public:

    void breed() const {
        std::cout << "        " << std::endl;
    }
};

class B {
public:

    void breed() const {
        std::cout << "        " << std::endl;
    }
};

/*
 * 
 */
int main(void) {

    Animal* a1 = new Mammal;
    a1->breed();

    Animal* a2 = new Ovipara;
    a2->breed();

    delete a1;
    delete a2;


    std::cout << "---------------------------" << std::endl;

    A a;
    const B b;
    breed(a);
    breed(b);

    breed(&a);
    breed(&b);
    


    std::cout << "              ,      ,                         ,    ,                      " << std::endl;
    
    return 0;
}