Множественное наследование от двух производных классов

В вашем ресурсе:

$return = parent::toArray($request);

unset($return['email']);

return $return;

Или, вы можете явно определить, что именно вы делаете хотите вернуть, вместо того чтобы полагаться на toArray:

return [
    'id' => $this->id,
    'message' => $this->message,
    // and so on...
];

Это дает вам больший контроль над окончательным ответом API, особенно если вы вносите изменения в базу данных / модель, но хотите, чтобы API оставался неизменным.

26
задан mmocny 31 October 2008 в 19:46
поделиться

4 ответа

Похоже, что Вы хотите сделать виртуальное наследование. Оказывается ли это, на самом деле хорошая идея, другой вопрос, но здесь, как Вы делаете это:


class AbsBase {...};
class AbsInit: public virtual AbsBase {...};
class AbsWork: public virtual AbsBase {...};
class NotAbsTotal: public AbsInit, public AbsWork {...};

В основном, значение по умолчанию, невиртуальное множественное наследование будет включать копию каждый базовый класс в производном классе и включает все их методы. Поэтому у Вас есть две копии AbsBase - и причина, Ваше использование метода неоднозначно, оба наборы методов, загружаются, таким образом, C++ не имеет никакого способа знать который копия к доступу!

Виртуальное наследование уплотняет все ссылки на виртуальный базовый класс в один datastructure. Это должно сделать методы из базового класса однозначными снова. Однако отметьте: если существуют дополнительные данные в двух промежуточных классах, может быть некоторое маленькое дополнительное время выполнения наверху, чтобы позволить коду найти общий виртуальный базовый класс.

35
ответ дан 28 November 2019 в 07:33
поделиться

Вы должны для объявления наследования как виртуального:

struct AbsBase {
          virtual void init() = 0;
          virtual void work() = 0;
};

struct AbsInit : virtual public AbsBase {
          void init() {  }
};

struct AbsWork : virtual public AbsBase {
          void work() { }
};

struct NotAbsTotal : virtual public AbsInit, virtual public AbsWork {
};

void f(NotAbsTotal *p)
{
        p->init();
}

NotAbsTotal x;
1
ответ дан 28 November 2019 в 07:33
поделиться

Это может быть сделано, хотя это дает больше всего дрожь.

необходимо использовать "виртуальное наследование", синтаксис, для которого что-то как

class AbsInit: public virtual AbsBase {...};
class AbsWork: public virtual AbsBase {...};
class NotAbsTotal: public AbsInit, public AbsWork {...};

Тогда, необходимо определить, какую функцию Вы хотите использовать:

NotAbsTotal::work()
{
    AbsInit::work_impl();
}

(ОБНОВЛЕННЫЙ с правильным синтаксисом)

1
ответ дан 28 November 2019 в 07:33
поделиться

Необходимо начать думать в терминах того, что Вы пытаетесь смоделировать здесь.

Общедоступное наследование должно только когда-либо использоваться для моделирования "isa" отношений, например, собака является животным, квадрат является формой, и т.д.

Взглянули на книгу Scott Meyer Эффективный C++ для превосходного эссе о том, что различные аспекты дизайна OO должны только когда-либо интерпретироваться как.

Редактирование: Я забыл говорить, что, в то время как ответы, до сих пор предоставленные, технически корректны, я не думаю, что любой из них решает проблемы того, что Вы пытаетесь смоделировать, и это - затруднение Вашей проблемы!

аплодисменты HTH

,

Rob

0
ответ дан 28 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: