Функция, которую вы запрашиваете, называется контр-дисперсией типа параметра.И C ++, к сожалению, не поддерживает это.C ++ поддерживает только ковариацию возвращаемого типа. См. здесь для хорошего объяснения.
Возможно, неудобно, C ++ не позволяет нам писать функцию, отмеченную hmm ... выше.Классическая ООП-система C ++ поддерживает «ковариантные типы возврата», но не поддерживает «контравариантные типы параметров».
Но вы можете использовать оператор dynamic_cast<>()
.Но сначала вы должны изменить тип параметра на указатель или ссылку и добавить по крайней мере один виртуальный член (в том числе виртуальный деструктор) в class ParameterBase
, чтобы компилятор создал для него таблицу виртуальных методов.Вот код со ссылками.Вместо них можно использовать указатели.
class ParameterBase
{
public:
// To make compiler to create virtual method table.
virtual ~ParameterBase()
{}
};
class ParameterDerived : public ParameterBase
{
};
class Base
{
public:
// Pointers or references should be used here.
virtual void f(const ParameterBase& pb) = 0;
};
class Derived : public Base
{
public:
virtual void f(const ParameterBase& pb) override
{
// And here is the casting.
const ParameterDerived& pd=dynamic_cast<const ParameterDerived&>(pb);
}
};
int main()
{
Derived d;
ParameterDerived p;
d.f(p);
}