Динамическое наследование должно означать, что вы можете изменять иерархию классов во время выполнения.
Это то, что должно быть довольно просто сделать на динамическом языке. Например, в 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 ++ и / или динамических языках или как вы интерпретируете термин динамическое наследование и придумали для него возможную правдоподобную модель.