C++: Полученный + реализация Базового класса единственный интерфейс?

Когда вы делаете

return this.http.post(url, { headers: this.getHttpHeaders(), params: myParams }));

Вы отправляете параметры в теле запроса, что и здесь ожидается

  1. GET отправляет данные в URL на сервер для получения данных из ресурс
  2. POST отправляет параметры в теле на сервер для обновления / создания ресурса

Следуйте этому порядку в вашем запросе:

 http.post(url, data, httpOptions)
12
задан user0118999881999119725 3 28 September 2012 в 18:08
поделиться

5 ответов

C++ не замечает, что функция, наследованная от Основы уже, реализует BaseFunction: Функция должна быть реализована явно в классе, полученном из Interface. Измените его этот путь:

class Interface
{
    public:
        virtual void BaseFunction() = 0;
        virtual void DerivedFunction() = 0;
};

class Base : public Interface
{
    public:
        virtual void BaseFunction(){}
};

class Derived : public Base
{
    public: 
        virtual void DerivedFunction(){}
};

int main()
{
    Derived derived;
}

Если Вы хотите смочь сойти с рук только реализацию одного из них, разделить Interface в два интерфейса:

class DerivedInterface
{
    public:
        virtual void DerivedFunction() = 0;
};

class BaseInterface
{
    public:
        virtual void BaseFunction() = 0;
};

class Base : public BaseInterface
{
    public:
        virtual void BaseFunction(){}
};

class Derived : public DerivedInterface
{
    public: 
        virtual void DerivedFunction(){}
};  

class Both : public DerivedInterface, public Base {
    public: 
        virtual void DerivedFunction(){}
};

int main()
{
    Derived derived;
    Base base;
    Both both;
}

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

16
ответ дан 2 December 2019 в 07:05
поделиться

Похоже, что не совсем имеет место, что Полученный "-" Основа, которая предполагает, что включение может быть лучшей реализацией, чем наследование.

Кроме того, Ваши Полученные функции членства должны быть объявлены как виртуальные также.

class Contained
{
    public:
        void containedFunction() {}
};

class Derived
{
    public:
        virtual void derivedFunction() {}
        virtual void containedFunction() {return contained.containedFunction();}
    private:
        Containted contained;
};

Можно сделать содержавшего участника ссылочным или интеллектуальным указателем, если Вы хотите скрыть детали реализации.

4
ответ дан 2 December 2019 в 07:05
поделиться

Проблема состоит в том, что с Вашим примером, у Вас есть две реализации Interface, тот, прибывающий из Base и тот, прибывающий из Derived. Это дизайном на языке C++. Как уже говорилось просто удалите Interface базовый класс на определении Derived.

1
ответ дан 2 December 2019 в 07:05
поделиться

Я соглашаюсь с ответом litb. Однако существует возможность здесь для понимания чего-то вроде, как работают виртуальные функции и множественное наследование.

Когда класс имеет несколько базовых классов, он имеет отдельный vtables для каждого базового класса. Derived будет иметь vtable структуру, которая похожа на это:

Derived
 vtable: Interface
   BaseFunction*
   DerivedFunction*
 vtable: Base
   BaseFunction*

Кроме того, каждый базовый класс только сможет видеть свое собственное vtable. Когда Base инстанцирован, это заполняет Base::BaseFunction указатель в vtable, но не видит vtable для Интерфейса.

Если код, который Вы предоставили, мог бы скомпилировать, получающаяся vtable структура экземпляра Derived был бы похож на это:

Derived
 vtable: Interface
   BaseFunction* = 0
   DerivedFunction* = Derived::DerivedFunction
 vtable: Base
   BaseFunction* = Base::BaseFunction
1
ответ дан 2 December 2019 в 07:05
поделиться

Я нашел одну вещь, недостающую из ответа litb. Если у меня есть a Derived экземпляр, я могу получить a DerivedInterface и BaseInterface. Но если у меня только есть a DerivedInterface Я не могу получить a BaseInterface начиная с получения DerivedInterface от BaseInterface не будет работать.

Но, это все время я ограничивал меня временем компиляции, проверяя по некоторым причинам. Это DerivedInterface просто работает отлично:

class DerivedInterface
{
    public:
        virtual void DerivedFunction() = 0;
        BaseInterface* GetBaseInterface()
            {return dynamic_cast<BaseInterface*>(this);}
};

void main()
{
    Derived derived;

    DerivedInterface* derivedInterface = &derived;
    derivedInterface->GetBaseInterface()->BaseFunction();
}

Нет пройдите через функции, необходимые в Полученном, и все счастливы. Несомненно, это больше не строго интерфейс, но это прекрасно. Почему я не думал об этом раньше?:)

0
ответ дан 2 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

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