/*
テンプレート引数の継承を反映するクラス
cppllで見かけた面白げなネタ。何に役立つかよくわかんないけどとりあえずメモっときます(^^;
*/
/// テンプレート引数の継承を反映するクラス
/// 参考 cppll ML No.9905-
#include <iostream>
#include <typeinfo>
#include <memory>
using namespace std;
// 娘のベースクラス
class A
{
public:
A()
{
cout << "ctor_A" << endl;
}
virtual void WhoAmI()
{
cout << "あたしは" << typeid(*this).name() << "だよ" << endl;
}
};
// 娘の長女
class B1 : public A
{
typedef A BaseType;
public:
B1()
{
cout << "ctor_B1" << endl;
}
};
// 娘の次女
class B2 : public A
{
typedef A BaseType;
public:
B2()
{
cout << "ctor_B2" << endl;
}
};
// お母さん
template <typename T> class S : public S<typename T::BaseType>
{
public:
S()
{
cout << "ctor_S" << endl;
}
// お母さんの姉のオーバーライドになる。
virtual void WhoIsMyDaughter()
{
// 自己紹介。
cout << "私は" << typeid(*this).name() << "だよ" << endl;
// 娘に名乗らせる
auto_ptr<T>(new T())->WhoAmI();
}
};
// お母さんの姉 (または「娘のベースクラス」の「お母さん」)
template <>
class S<A>
{
public:
S()
{
cout << "ctor_S(base)" << endl;
}
// ここは汎化してかけないかな。
virtual void WhoIsMyDaughter()
{
// 自己紹介。
cout << "私は" << typeid(*this).name() << "だよ" << endl;
// 娘に名乗らせる
auto_ptr<A>(new A())->WhoAmI();
}
};
int main()
{
// 娘のベースクラスのポインタから「私は誰? 」
auto_ptr<A>(new A())->WhoAmI();
auto_ptr<A>(new B1())->WhoAmI();
auto_ptr<A>(new B2())->WhoAmI();
// お母さんの姉のポインタから「私の娘は誰? 」
auto_ptr<S<A> >(new S<A>())->WhoIsMyDaughter();
auto_ptr<S<A> >(new S<B1>())->WhoIsMyDaughter();
auto_ptr<S<A> >(new S<B2>())->WhoIsMyDaughter();
system("pause");
}