26 октября 2006

Easy constructors

Иногда необходимо расширить поведение существующего класса - добавить метод, изменить метод.

В простейшем случае все выглядит достаточно просто:
class Foo : public Bar
{
public:
void NewMember();
}

Однако в таком случае унаследованы все публичные методы, но не конструкторы Bar (разве что кроме конструктора по умолчанию). Вручную "наследовать" все конструкторы может быть довольно утомительно, поможет парочка шаблонных конструкторов:
class Foo : public Bar
{
public:
Foo() : Bar() {}
template <typename T> Foo(T t) : Bar(t) {}
template <typename T1, typename T2> Foo(T1 t1, T2 t2) : Bar(t1, t2) {}
...

void NewMember();
}

5 комментариев:

Headcrab комментирует...

Видимо всетаки так:
class Bar : public Foo
{
public:
Bar() : Foo() {}
// и далее тоже
...
}

Raider комментирует...

конечно!

AnToXa комментирует...

можно и макросик тогда сбацать, чтобы каждый раз не писать, имхо тут в самый раз.

что-то типа DEFINE_FORWARDING_CTORS(Derived, Base)

Raider комментирует...

AnToXa: да, точно. Насколько уж я не люблю макросы препроцессора - но тут как раз отличная возможность их заиспользовать.

AnToXa комментирует...

да уж кто их любит :)