Переопределенная функция применяется к списку базовых классов

0

я просто хочу знать, есть ли способ сделать что-то вроде этого:

Class A {}; //Base class

Class B : A {}; //B inherits from A

Class C : A {}; //C inherits from A

...
...
...

void func(B){do x;}
void func(C){do y;}
...
...
...
list<A> l //l contains Bs or Cs.

for each element in l {func(element);}

И получить ожидаемое поведение для каждого из них?

  • 0
    Вы должны сделать так, чтобы у A был virtual деструктор, а функция, которую вы хотите переопределить, также была бы virtual ; и затем использовать list<A*> list< shared_ptr<A> > или, предпочтительно, list< shared_ptr<A> >
Теги:
inheritance
overloading
virtual

3 ответа

2

Вы можете сделать что-то вроде следующего:

    class A // Base clss
    {
       public: // or protected, depends on your needs
         virtual void func() {};
    };

    class B : public A //B inherits from A
    {
       public: // or protected, depends on your needs
         void func() { do x };
    }; 

    class C : public A //C inherits from A
    {
       public: // or protected, depends on your needs
         void func() { do y };
    }; 

    ...
    ...
    ...

    list<A*> l //l contains Bs or Cs.

    for each element in l { element->func(); }

Таким образом, вы используете полиморфизм вместо перегрузки статической функции func.

  • 0
    Не работает, объекты выделяются, когда они помещаются в list<A> .
  • 0
    Да, вы правы, конечно, это должен быть список <A *>. Мой фрагмент кода был скорее псевдокодом для объяснения структуры классов. Также "do x" и "do y" не работают ...
0
#include <iostream>
#include <vector>

class A
{
public:
    virtual void func() {}
};

class B : public A
{
public:
    void func()
    {
        std::cout << "B prints x" << std::endl;
    }
};

class C : public A
{
public:
    void func()
    {
        std::cout << "C prints y" << std::endl;
    }
};

int main()
{
    std::vector<A*> v;
    v.push_back(new B());
    v.push_back(new C());
    for (std::vector<A*>::iterator it = v.begin(); it != v.end(); ++it){
        (*it)->func();
    }
    return 0;
}

Вывод:

B prints x
C prints y
0

Вы можете использовать полиморфизм. Например

#include <iostream>
#include <memory>
#include <list>
#include <algorithm>

class A 
{
public:
   virtual ~A() {}
   virtual void do_it() = 0;  
};

class B : public A 
{
public:
   virtual void do_it() { std::cout << "processing of B\n"; };  

};

class C : public A 
{
public:
   virtual void do_it() { std::cout << "processing of C\n"; };  
};

void f( std::unique_ptr<A> &pa ) { pa->do_it(); }

int main()
{
    std::list<std::unique_ptr<A>> l;
    l.push_back( std::unique_ptr<A>( new B ) );
    l.push_back( std::unique_ptr<A>( new C ) );

    std::for_each( l.begin(), l.end(), f );
} 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню