Наследование реализации метода одноименного класса
От: slavo  
Дата: 06.09.07 15:26
Оценка:
День добрый,
есть два неймспейса, в которых есть одноименные классы. Класс неймспейса наследуется от одноименного класса из неймспейса . Теперь я хочу переопределяю виртуальную функцию , но хочу вызвать и унаследованный код. Как это сделать?


namespace NA1
{
    class cA1
    {
    public:
        
        virtual void Foo()
        {
            int a = 1;
        }
    };
}

namespace NA2
{
    class cA1: public NA1::cA1
    {
    public:
        
        virtual void Foo()
        {
            int b = 1;

            cA1::Foo();  // <----- как сказать, что мне нужно вызвать реализацию Foo из одноименного класса, но другого неймспейса?
        }
    };
}


Как сказать, что мне нужно вызвать реализацию Foo из одноименного класса, но другого неймспейса?
Так NA1::cA1::Foo(); не компиляется.
Так cA1::Foo(); вызывается текущий метод. Получается зацикливание.
Re: Наследование реализации метода одноименного класса
От: Sergey Россия  
Дата: 06.09.07 15:45
Оценка: 1 (1)
А так не получится?

namespace NA2
{
    class cA1: public NA1::cA1
    {
        typedef NA1::cA1 parent_t;
    public:
        
        virtual void Foo()
        {
            int b = 1;

            parent_t::Foo();
        }
    };
}
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Наследование реализации метода одноименного класса
От: Bell Россия  
Дата: 06.09.07 15:48
Оценка: 34 (2)
Здравствуйте, slavo, Вы писали:

Comeau и VC7.1 компилят вариант с NA1::cA1::Foo(); без проблем.
Отсюда можно сделать вывод, что ты пытаешься реализовать это чудо на VC6.
Если я прав, то вот воркэраунд для него:

namespace NA1
{
    class cA1
    {
    public:
        
        virtual void Foo()
        {
            int a = 1;
        }
    };
}

namespace NA2
{
    class cA1: public NA1::cA1
    {
    public:
        
        virtual void Foo()
        {
            int b = 1;
            typedef NA1::cA1 Base;

            Base* ptr = this;
            ptr->Base::Foo();  
        }
    };
}


int main()
{
   NA2::cA1 a;
   a.Foo();
   return 0;
}


ЗЫ
В глазах от одноименных классов немного рябит.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Наследование реализации метода одноименного класса
От: Bell Россия  
Дата: 06.09.07 15:51
Оценка:
Здравствуйте, Sergey, Вы писали:


S>А так не получится?


Не, VC6 так просто не возьмешь
Любите книгу — источник знаний (с) М.Горький
Re[2]: Наследование реализации метода одноименного класса
От: slavo  
Дата: 06.09.07 15:51
Оценка:
Здравствуйте, Sergey, Вы писали:


S>А так не получится?


S>
S>namespace NA2
S>{
S>    class cA1: public NA1::cA1
S>    {
S>        typedef NA1::cA1 parent_t;
S>    public:
        
S>        virtual void Foo()
S>        {
S>            int b = 1;

S>            parent_t::Foo();
S>        }
S>    };
S>}
S>


не работает. Зацикливается.
Re[2]: Наследование реализации метода одноименного класса
От: slavo  
Дата: 06.09.07 15:53
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, slavo, Вы писали:


B>Comeau и VC7.1 компилят вариант с NA1::cA1::Foo(); без проблем.

B>Отсюда можно сделать вывод, что ты пытаешься реализовать это чудо на VC6.
B>Если я прав, то вот воркэраунд для него:

B>
B>namespace NA1
B>{
B>    class cA1
B>    {
B>    public:
        
B>        virtual void Foo()
B>        {
B>            int a = 1;
B>        }
B>    };
B>}

B>namespace NA2
B>{
B>    class cA1: public NA1::cA1
B>    {
B>    public:
        
B>        virtual void Foo()
B>        {
B>            int b = 1;
B>            typedef NA1::cA1 Base;

B>            Base* ptr = this;
            ptr->>Base::Foo();  
B>        }
B>    };
B>}


B>int main()
B>{
B>   NA2::cA1 a;
B>   a.Foo();
B>   return 0;
B>}
B>


B>ЗЫ

B>В глазах от одноименных классов немного рябит.

Спасибо, работает! Ага, шестая студия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.