C ++ перегруженные функции и подклассы - PullRequest
1 голос
/ 25 апреля 2011

Предположим, у меня есть:

struct Vehicle {...}
struct Car : public Vehicle {...}

string A(Vehicle *v) { return "vehicle"; }
string A(Car *c) { return "car"; }

И я делаю это:

Vehicle *v = new Car();
cout << A(v);

Почему компилятор распечатывает «транспортное средство»? В конце концов, v указывает на объект Car.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

Перегруженная функция A(Vehicle*) лучше подходит для аргумента типа Vehicle*.Таким образом, cout выведет:

vehicle

Объяснение:

Разрешение перегруженной функции выполняется на основе аргумента static .,И статический тип аргумента v равен Vehicle*.Поэтому будет вызвана функция A(Vehicle*).

1 голос
/ 25 апреля 2011

Это пример статического связывания. Во время компиляции становится ясно, что будет вызвана функция string A(Vehicle *v). Конечно, «транспортное средство» должно быть на выходе.

1 голос
/ 25 апреля 2011
"vehicle" 

распечатывается

Это происходит потому, что статический тип v - это Автомобиль. Таким образом, A, определенный для Vehicle, используется компилятором.

Компилятор использует информацию динамического типа при вызове функции-члена для выполнения вызовов виртуальных методов. Требуется ключевое слово virtual. В этом случае указатель «this» будет соответствующим образом понижен на соответствующем уровне переопределения.

Тем не менее, за пределами этого особого случая компилятор не будет использовать вас без явной динамической передачи.

...