динамическое наследование в C ++ - PullRequest
2 голосов
/ 05 ноября 2011

В интервью я столкнулся с вопросом о динамическом наследовании, но я никогда не использовал динамическое наследование в C ++.Я хочу знать, как мы можем реализовать динамическое наследование в C ++ и как практическое использование динамического наследования в языке C ++?

Ответы [ 3 ]

10 голосов
/ 05 ноября 2011

Динамическое наследование должно означать, что вы можете изменять иерархию классов во время выполнения.

Это то, что должно быть довольно просто сделать на динамическом языке. Например, в Javascript объект будет иметь свойство prototype. Если вы попытаетесь получить доступ к методу или свойству, не определенному для этого объекта, он будет найден в объекте-прототипе и т. Д. Если вы измените прототип, вы фактически измените, что объект может делать. См. здесь и Wikipedia для более подробного описания звука.

Что касается того, как вы могли бы реализовать это в C ++, это, вероятно, было бы довольно грязно. Для упрощенного примера:

class A{

public:

    /*some fields*/

    virtual ~A() { }
    virtual void f() = 0;
    virtual void g() = 0;

};

class B1 : public A{
public:
    virtual void f(){ /*B1 implementation*/ }
    virtual void g(){ /*B1 implementation*/ }
};

class B2 : public A{
public:
    virtual void f(){ /*B2 implementation*/ }
    virtual void g(){ /*B2 implementation*/ }
};

class C : public B1{

public:
    /* ... */

};

вы должны иметь возможность просто (хотя и для конкретного компилятора) переключить vptr в C объекте, чтобы он указывал на v-таблицу для B2 во время выполнения, и у вас будет C ведет себя так, как будто его класс унаследован от B2. Этот подход может очень быстро запутаться, если мы добавим макеты объектов и, возможно, автоматическое встраивание - скажем, если компилятор думает, что знает, что такое динамический тип объекта, и не беспокоится о vtable.

Чтобы сделать это правильно в C ++, я думаю, вам, возможно, придется прибегнуть к какой-то системе таблиц, возможно, используя metatables , как в Lua, и тогда вы отбросите все удобные манеры синтаксис. Или вы получите язык сценариев. В определенном смысле, поскольку большинство интерпретаторов динамического языка написаны на C или C ++, можно утверждать, что они добавляют поддержку динамического наследования в C ++.

Суть в том (и именно поэтому анонимный ребёнок с сомнительной репутацией опроверг ответы моих коллег), даже если в интервью вам задали на первый взгляд глупый вопрос, вы должны подумать о возможных решениях. Интервьюер, возможно, хотел знать, сколько вы знаете о C ++ и / или динамических языках или как вы интерпретируете термин динамическое наследование и придумали для него возможную правдоподобную модель.

9 голосов
/ 05 ноября 2011

Вы не можете и нет.Не существует такого понятия, как динамическое наследование.

Возможно, вы имеете в виду dynamic_cast, который представляет собой совершенно другой чайник рыбы.

7 голосов
/ 05 ноября 2011

такого понятия нет

это просто цепочка слов, собранных ассоциативным образом

ура & hth.,

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