Присвоение базового класса производному и наоборот в C ++ и различие между статическими и динамическими объектами - PullRequest
0 голосов
/ 19 сентября 2018

Учитывая

class base { }

И

class derived: public base {}

В чем разница между:

ПЕРВЫЙ СЛУЧАЙ:

int main() {
  base b;
  derived d;
}

И

ВТОРОЙ СЛУЧАЙ:

int main() {
  base *b;
  derived *d;
}

А если мы во втором случае опустимся и опустим, как это:

  // upcast - implicit type cast allowed
  Base *b= &d; 

  // downcast - explicit type case required 
  Derived *d=  (Dervied *) &b;

Какмы можем сделать это в первом случае?

1 Ответ

0 голосов
/ 19 сентября 2018

Части этого ответа взяты из этот вопрос переполнения стека .

Указатель и ссылки допускают позднюю привязку / полиморфизм во время выполнения, в то время как объекты будут вызывать нарезку объектов (см. Комментарий @ 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.

...