У меня есть приложение Visual Studio 2008 C ++ с несколькими типами объектов, которые являются производными от общей базы.Например:
class Base
{
public:
std::string Time() const { /*return formatted time*/; };
private:
SYSTEMTIME time_;
};
class Foo : public Base
{
public:
const char* FooFunc() const { return "Hello from foo!"; };
};
typedef std::vector< Base > BaseList;
class Bar : public Base
{
public:
const char* BarFunc() const { return "Hello from bar!"; };
void push_back( const Base& obj ) { list_.push_back( obj ); };
BaseList::const_iterator begin() const { return list_.begin(); };
BaseList::const_iterator end() const { return list_.end(); };
private:
BaseList list_;
};
Эти объекты хранятся в std::vector< Base >
.Мне нужно вывести информацию в каждом из классов Foo
и Bar
, а также информацию, хранящуюся в базе. Но я бы хотел избежать RTTI .
int main( int, char** )
{
BaseList list;
Foo foo;
Bar bar;
Foo foo2;
list.push_back( foo );
list.push_back( bar );
bar.push_back( foo2 );
for( BaseList::const_iterator it = list.begin();
it != list.end();
++it )
{
printf( "%s ", it->Time() );
// print Foo information for objects of type Foo
// OR print Bar information for objects of type Bar.
// Descend in to objects of type Bar to print its children.
}
return 0;
}
В этом случае желаемый результат будет:
11:13:05 Hello from foo!
11:22:14 Hello from bar!
11:26:04 Hello from foo!
Какие изменения я могу внести в этодизайн, который позволил бы избежать использования RTTI в качестве решения, но все же позволил бы мне хранить объекты типа Foo
и Bar
с различной функциональностью во вложенной древовидной структуре?
Спасибо, PaulH