Интересная задача (множественное наследование в C++)

Модератор: Модераторы разделов

Аватара пользователя
whirlwind
Сообщения: 67

Интересная задача

Сообщение whirlwind »

такая вот учебная задачка нашлась (см. комментарии):

Код: Выделить всё

class Top {
public:
virtual ~Top (){}
};

class Right : virtual public Top {
public:
void f () {}
};

class Left : virtual public Top {
public:
void f () {}
};

class Bottom : public Right, public Left {
public:
/*
* что надо написать чтобы выполнялось требование описанное в main
*/
};

int main (int, char**) {
Bottom b;
b.f(); // Требование: вызов Left::f()
}


Я лично не нашел ничего лучше, чем добавить строку вида

Код: Выделить всё

        void f () { Left::f();}


но как-то оно совсем коряво выглядит. Кроме того, получается, что в условие задачи избыточно: класс Top лишний. У него ведь не методов, ни функций, поэтому конфликтов не предвидится, хотя два класса от него наследуются.

Короче, из чистого любопытства интересно было бы узнать правильный ответ :)

P.S.: задача предлагается Яндексом при приеме на работу C++ разработчиков.
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Интересная задача

Сообщение Olegator »

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

Код: Выделить всё

void f()
{
    Left *L;
    L = (Left*)this;
    L->f();
}
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Интересная задача

Сообщение Olegator »

Фу я бред написал какой-то, не обращайте внимание :)
Спасибо сказали:
fulltick
Сообщения: 25

Re: Интересная задача

Сообщение fulltick »

Можно так:

Код: Выделить всё

class Bottom : public Right, public Left {
public:
    using Left::f;
};
Спасибо сказали:
fulltick
Сообщения: 25

Re: Интересная задача

Сообщение fulltick »

whirlwind писал(а):
24.10.2008 17:46
Кроме того, получается, что в условие задачи избыточно: класс Top лишний. У него ведь не методов, ни функций, поэтому конфликтов не предвидится, хотя два класса от него наследуются.

Обрати внимание, что
а) В классе Top виртуальный деструктор
б) Наследование тоже виртуальное.
Спасибо сказали: