マルチステートの実装、継承とテンプレート関数
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;
}