c++ のめもー

/*
テンプレート引数の継承を反映するクラス
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");
}

About this Entry

This page contains a single entry by mutsumi published on 2003年12月 4日 10:39.

ふぇーたるふれーむ was the previous entry in this blog.

激写! ドキドキ心霊写真 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Pages

Powered by Movable Type 5.031