Сообщение Re[6]: Множественное наследование интерфейсов от 14.06.2018 5:00
Изменено 14.06.2018 5:02 AlexGin
Re[6]: Множественное наследование интерфейсов
Здравствуйте, Максим Рогожин, Вы писали:
МР>Здравствуйте, AlexGin, Вы писали:
AG>>У класса может быть только один деструктор!
МР>Спасибо! А вот так можно делать?
ИМХО — неудачный дизайн архитектуры проекта, я бы не советовал так делать
...
МР>Тут все то же самое что и с деструкторами? Метод doSomething() можно вызывать через любой интерфейс? Не зависимо от того на каком месте он в интерфейсах объявлен?
Неоднозначности для компилятора — не будет, компилятор такой код успешно проглотит.
Для понимания остальными разработчиками в команде (да и тобой самим через пару месяцев после сдачи проекта) —
подобные решениябудут могут восприниматься неоднозначно:
Так, если оба интерфейса имеют одноименный мембер, то — зачем наследовать от обоих?
Может быть — удачнее было бы отнаследоать новый интерфейс (назовем его Interface1Cool):
МР>Здравствуйте, AlexGin, Вы писали:
AG>>У класса может быть только один деструктор!
МР>Спасибо! А вот так можно делать?
ИМХО — неудачный дизайн архитектуры проекта, я бы не советовал так делать
...
МР>Тут все то же самое что и с деструкторами? Метод doSomething() можно вызывать через любой интерфейс? Не зависимо от того на каком месте он в интерфейсах объявлен?
Неоднозначности для компилятора — не будет, компилятор такой код успешно проглотит.
Для понимания остальными разработчиками в команде (да и тобой самим через пару месяцев после сдачи проекта) —
подобные решения
Так, если оба интерфейса имеют одноименный мембер, то — зачем наследовать от обоих?
Может быть — удачнее было бы отнаследоать новый интерфейс (назовем его Interface1Cool):
class Interface1 {
public:
virtual ~Interface1() {} // vtbl[0]
virtual void doSomething() = 0; // vtbl[1] Такой же как и в Interface2, но на первой позиции в vtbl
virtual void doSomething1() = 0; // vtbl[2]
};
class Interface1Cool : public Interface1
{
virtual void doSomethingCool() = 0;
virtual void doSomething2() = 0;
};
class SomeClass : public Interface1Cool
{
public:
~SomeClass() {};
void doSomething1() override;
void doSomething2() override;
void doSomething() override;
void doSomethingCool() override;
//...
};
Re[6]: Множественное наследование интерфейсов
Здравствуйте, Максим Рогожин, Вы писали:
МР>Здравствуйте, AlexGin, Вы писали:
AG>>У класса может быть только один деструктор!
МР>Спасибо! А вот так можно делать?
...
ИМХО — неудачный дизайн архитектуры проекта, я бы не советовал так делать
Компилятор — тебя поймёт, но коллеги по проекту (а возможно — ты же сам, через полгода-год) будут плеваться...
...
МР>Тут все то же самое что и с деструкторами? Метод doSomething() можно вызывать через любой интерфейс? Не зависимо от того на каком месте он в интерфейсах объявлен?
Неоднозначности для компилятора — не будет, компилятор такой код успешно проглотит.
Для понимания остальными разработчиками в команде (да и тобой самим через пару месяцев после сдачи проекта) —
подобные решениябудут могут восприниматься неоднозначно:
Так, если оба интерфейса имеют одноименный мембер, то — зачем наследовать от обоих?
Может быть — удачнее было бы отнаследоать новый интерфейс (назовем его Interface1Cool):
МР>Здравствуйте, AlexGin, Вы писали:
AG>>У класса может быть только один деструктор!
МР>Спасибо! А вот так можно делать?
...
ИМХО — неудачный дизайн архитектуры проекта, я бы не советовал так делать
Компилятор — тебя поймёт, но коллеги по проекту (а возможно — ты же сам, через полгода-год) будут плеваться...
...
МР>Тут все то же самое что и с деструкторами? Метод doSomething() можно вызывать через любой интерфейс? Не зависимо от того на каком месте он в интерфейсах объявлен?
Неоднозначности для компилятора — не будет, компилятор такой код успешно проглотит.
Для понимания остальными разработчиками в команде (да и тобой самим через пару месяцев после сдачи проекта) —
подобные решения
Так, если оба интерфейса имеют одноименный мембер, то — зачем наследовать от обоих?
Может быть — удачнее было бы отнаследоать новый интерфейс (назовем его Interface1Cool):
class Interface1 {
public:
virtual ~Interface1() {} // vtbl[0]
virtual void doSomething() = 0; // vtbl[1] Такой же как и в Interface2, но на первой позиции в vtbl
virtual void doSomething1() = 0; // vtbl[2]
};
class Interface1Cool : public Interface1
{
virtual void doSomethingCool() = 0;
virtual void doSomething2() = 0;
};
class SomeClass : public Interface1Cool
{
public:
~SomeClass() {};
void doSomething1() override;
void doSomething2() override;
void doSomething() override;
void doSomethingCool() override;
//...
};