Когда вы делаете
return this.http.post(url, { headers: this.getHttpHeaders(), params: myParams }));
Вы отправляете параметры в теле запроса, что и здесь ожидается
Следуйте этому порядку в вашем запросе:
http.post(url, data, httpOptions)
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
перед функциями членства в полученных, которые были виртуальными в основе, даже если она строго не требуется.
Похоже, что не совсем имеет место, что Полученный "-" Основа, которая предполагает, что включение может быть лучшей реализацией, чем наследование.
Кроме того, Ваши Полученные функции членства должны быть объявлены как виртуальные также.
class Contained
{
public:
void containedFunction() {}
};
class Derived
{
public:
virtual void derivedFunction() {}
virtual void containedFunction() {return contained.containedFunction();}
private:
Containted contained;
};
Можно сделать содержавшего участника ссылочным или интеллектуальным указателем, если Вы хотите скрыть детали реализации.
Проблема состоит в том, что с Вашим примером, у Вас есть две реализации Interface
, тот, прибывающий из Base
и тот, прибывающий из Derived
. Это дизайном на языке C++. Как уже говорилось просто удалите Interface
базовый класс на определении Derived
.
Я соглашаюсь с ответом 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
Я нашел одну вещь, недостающую из ответа 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();
}
Нет пройдите через функции, необходимые в Полученном, и все счастливы. Несомненно, это больше не строго интерфейс, но это прекрасно. Почему я не думал об этом раньше?:)