Передача дочернего объекта в функцию

128
26 декабря 2020, 16:50

Имеется просто код:

void foo(A a){
  a.speak();
}
class A{
public:
    void speak(){cout << "A speak\n";}
};
class B : public A{
public:
    void speak(){cout << "B speak\n";}
};
int main(){
 A a;
 B b;
 foo(a);
 foo(b);
}

Из книг что я прочел я узнал что указатель типа А может ссылаться на объекты дочек класса А, но тут в функцию объект b передается по значению и при этом код работает. Я не могу понять, почему так происходит, разве компилятор не должен ругаться на эту строку?

Answer 1

В комментарии упомянули "object slicing", но это не совсем тот ответ который вам нужен. Грубо говоря при вызове foo(b); происходит копирование.

Объект типа B копируется в объект типа A и проиходит "object slicing". В вашем примере нет потерь данных, но в реальных объектах они могут быть. Например:

class A {
   int foo;
};
class B : public A {
   int bar;
};

Объект типа B имеет два поля. Но если бы вы написали:

B b;
A a = b;

Информация b о bar теряется в a.

Компилятор на такое не ругается потом что это его "нормальное" поведение. Он без труда может разрешить такую ситуацию просто "не копировав" поля. И ошибок не будет ведь вашей функции не нужны поля класса B.

READ ALSO
Уведомить QAbstractTableModel об изменении data sourse

Уведомить QAbstractTableModel об изменении data sourse

Возможно, данная тема обсуждалась большое количество раз, но я не смог найти однозначного ответа и рабочей реализации задачи

129
Не могу вызвать перегрузку

Не могу вызвать перегрузку

Продолжаю пробовать перегружать операторы, и вновь не могу вызвать перегрузкуНапример, есть класс List:

136
Линия которую я не понимаю

Линия которую я не понимаю

Вызываю функцию которая рисует круги и почему то дорисовывает одну точку из центра и не как избавиться от этого "явления" не могу

137
Не учитывать клик по элементам родителя

Не учитывать клик по элементам родителя

Нужно получить клик только по контейнеруЕсли я произвожу клик по элементам внутри контейнера, то они тоже засчитываются

100