Я определил интерфейс Cloneable:
struct Cloneable
{
virtual Cloneable * clone(void) const = 0;
}
У меня также есть некоторые другие классы интерфейса (содержимое не относится к проблеме):
struct Interface
{
};
struct Useful_Goodies
{
};
Я создал объект листа, которыйнаследует от вышеуказанных классов:
struct Leaf : public Cloneable, public Interface, public Useful_Goodies
{
Leaf * clone(void) const // Line #1 for discussion.
{
return new Leaf(*this);
}
};
Я получаю сообщение об ошибке:
overriding virtual function return type differs and is not covariant from 'Cloneable::clone'
Если я изменю тип на Cloneable *
, я получу это сообщение об ошибке:
'return' : ambiguous conversions from 'Leaf *' to 'Cloneable *'
Мои вопросы (все связанные):
- Каким образом листовой класс может соответствовать требованиям интерфейса
Cloneable
? - есть лучшее решение для реализации контракта на клонирование, где все объекты гарантированно реализуют клонирование?
Я использую эту парадигму как часть общего программирования (записи, поля и базы данных).
Компилятор: MS Visual Studio 2008;Платформы: Windows XP и Vista