Части этого ответа взяты из этот вопрос переполнения стека .
Указатель и ссылки допускают позднюю привязку / полиморфизм во время выполнения, в то время как объекты будут вызывать нарезку объектов (см. Комментарий @ Francois Andrieux).
Что приводит к нарезке этого объекта: если вы используете объекты напрямую, вы потеряете информацию и, возможно, вызовете неправильные методы, даже если вы используете виртуальные методы.
Вотпример:
#include <iostream>
using namespace std;
class A
{
public : virtual void print(void)
{
cout<< "A::print()"<<endl;
}
};
class B : public A
{
public : virtual void print(void)
{
cout<<"B::print()"<<endl;
}
};
int main(void)
{
A a;
B b;
A& ref = b;
a=b;
a.print();
ref.print();
return 0;
}
Класс B наследуется от A. A a = b;
приведет к вызову метода печати Class As, в то время как использование ссылки (или указателя) приведет к вызову метода Class B (правильный классоценивается во время выполнения).
Ваши комментарии "как это сделать" указывают мне, что вы пытаетесь решить конкретную проблему.Не могли бы вы сформулировать свою проблему вместо этого?Выполнение этой работы, возможно, не является правильным решением вашей проблемы.
Относительно понижения: Насколько я знаю, вам следует снижать значение только в том случае, если у вас есть указатель базового класса на объект производного класса и вам необходимо выполнитьметоды производного класса, а затем ответ будет dynamic_cast.