Вы можете получить полиморфное поведение, только если получите доступ к классу через указатель или ссылку. Кроме того, вы нарезаете объект, когда копируете производный тип в базовый тип без указателя / без ссылки.
Нарезка:
http://en.wikipedia.org/wiki/Object_slicing
С учетом этих определений:
#include<iostream>
class Objeto {
public:
virtual bool interseca() {
return false;
}
};
class Esfera: public Objeto {
public:
int idMaterial;
virtual bool interseca() {
return true;
}
};
Это не будет делать то, что вы хотите:
Esfera e;
Objeto o = e;
std::cout << o.interseca() << "\n";
ложь
Но это будет:
Esfera e;
Objeto& o = e;
std::cout << o.interseca() << "\n";
правда
Разработка программы
Техника, которую вы можете использовать, чтобы избежать этого в будущем, - сделать базовые классы (чистыми) абстрактными.
Вы когда-нибудь могли бы создать истинное Objeto
в своей сцене или вы просто определяете базовый тип? Если вы просто определяете базовый тип (который я рекомендую), тогда вы можете сделать interseca
, breakNormal
и normal
чисто виртуальными . Затем компилятор обнаружит проблемы, подобные той, что у вас есть.
class Objeto {
public:
virtual bool interseca() = 0;
};
class Esfera: public Objeto {
public:
int idMaterial;
virtual bool interseca()
{
return true;
}
};
// ...
Тогда это будет хорошо:
Esfera e;
Objeto& o = e;
std::cout << o.interseca() << "\n";
компиляция завершена
Но это приведет к ошибке компилятора - хорошо, потому что он ловит ошибку:
Esfera e;
Objeto o = e;
std::cout << o.interseca() << "\n";
ошибка: невозможно выделить объект абстрактного типа 'Objeto'