Я хочу реализовать некоторую иерархию классов с полиморфизмом, и я не могу заставить его работать. У меня есть две проблемы:Производный класс с дополнительными частными атрибутами
- производный класс имеет дополнительные частные переменные
- методы производного класса принимают в качестве аргумента объект производного класса и возвращает объект производного класса.
Я могу сделать этот код работающим, но не полиморфным способом. Это упрощенная версия:
class Base
{
protected:
int mInt;
public:
Base(int iValue) : mInt(iValue) {}
virtual Base operator+(const Base otherBase)
{
Base result(otherBase.mInt + mInt);
return result;
}
};
class Derived : public Base
{
private:
double mDouble;
public:
Derived(int iValue, double dValue) : Base(iValue)
{
mDouble = dValue;
}
Derived operator+(const Derived otherDerived)
{
Derived result(otherDerived.mInt + mInt,
otherDerived.mDouble + mDouble);
return result;
}
};
int main()
{
Derived DobjectA(2,6.3);
Derived DobjectB(5,3.1);
Base* pBaseA = &DobjectA;
Base* pBaseB = &DobjectB;
// This does not work
Derived DobjectC = (*pBaseA)+(*pBaseB);
}
Как я могу создать классы для выполнения этой работы?
возможно, это может помочь http://stackoverflow.com/questions/274626/what-is-object-slicing –
Что вы ожидаете если 'pBaseB' фактически указывает на объект« Base »(или любой другой производный тип - кроме« Derived »- если на то пошло ...)? – Amit
@Amit Я думаю, лучшим решением будет бросить исключение, если тип, указанный pBaseB, не является производным. – Msegade