я просто хочу знать, есть ли способ сделать что-то вроде этого:
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);}
И получить ожидаемое поведение для каждого из них?
Вы можете сделать что-то вроде следующего:
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.
list<A>
.
#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
Вы можете использовать полиморфизм. Например
#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 );
}
A
былvirtual
деструктор, а функция, которую вы хотите переопределить, также была быvirtual
; и затем использоватьlist<A*>
list< shared_ptr<A> >
или, предпочтительно,list< shared_ptr<A> >