Имеется просто код:
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 передается по значению и при этом код работает. Я не могу понять, почему так происходит, разве компилятор не должен ругаться на эту строку?
В комментарии упомянули "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
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Возможно, данная тема обсуждалась большое количество раз, но я не смог найти однозначного ответа и рабочей реализации задачи
Продолжаю пробовать перегружать операторы, и вновь не могу вызвать перегрузкуНапример, есть класс List:
Вызываю функцию которая рисует круги и почему то дорисовывает одну точку из центра и не как избавиться от этого "явления" не могу
Нужно получить клик только по контейнеруЕсли я произвожу клик по элементам внутри контейнера, то они тоже засчитываются