Интересный вопрос о декораторах на С++.
От: Germes Украина  
Дата: 08.11.10 18:55
Оценка: :))
class I_A
{
public:

    virtual void foo1() =0;
    virtual void foo2() =0;
    virtual ~I_A()
    {    }
};

class A : public I_A
{
public:
    virtual void foo1()
    {
        std::cout<<"foo:"<<"A"<<std::endl;
    }
    virtual void foo2()
    {
        std::cout<<"foo2:"<<"A"<<std::endl;
    }
};

template<typename T>
class foo2_decorator: virtual public T
{
    
public:
    typedef T base_type;

    foo2_decorator(const base_type& val):
        base_type(val)
    {
    }

    void foo2()
    {
        std::cout<<"foo2_decorator:"<<"foo2"<<std::endl;
    }
private:
};

template<typename T>
class foo1_decorator: virtual public T
{

public:
    typedef T base_type;

    foo1_decorator(const base_type& val):
    base_type(val)
    {
    }

    void foo1()
    {
        std::cout<<"foo1_decorator:"<<"foo1"<<std::endl;
    }
private:
};



int _tmain(int argc, _TCHAR* argv[])
{
    std::cout<<"-------------------------------"<<std::endl;
    A* p_A = new A;
    p_A->foo1();
    p_A->foo2();
    
    std::cout<<"-------------------------------"<<std::endl;
    p_A = new foo1_decorator<A>(*p_A);
    p_A->foo1();
    p_A->foo2();

    std::cout<<"-------------------------------"<<std::endl;
    p_A = new foo2_decorator<A>(*p_A);
    p_A->foo1();    
    p_A->foo2();

    std::cout<<"-------------------------------"<<std::endl;
    I_A* p_IA = p_A;
    p_IA->foo1();
    p_IA->foo2();



    return 0;
}


Output:
-------------------------------
foo:A
foo2:A
-------------------------------
foo1_decorator:foo1
foo2:A
-------------------------------
foo:A
foo2_decorator:foo2
-------------------------------
foo:A
foo2_decorator:foo2

Вопрос :
почему применение 2 декоратора отменяет действие первого ?
С уважением Germes!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.