Я читаю головоломку C ++ здесь: http://gotw.ca/gotw/005.htm
Я не понял его объяснения статического и динамического разрешения перегрузки (или параметров по умолчанию), поэтому я попытался решить проблему и сам написать несколько тестов:
class Base {
public:
virtual void foo() {cout << "base/no parameters" << endl;}
virtual void foo(int a) {cout << "base/int" << endl;}
};
class Derived : public Base {
public:
void foo() {cout << "derived/no parameters" << endl;}
void foo(double a) {cout << "derived/int" << endl;}
};
int main() {
Base* ptr = new Derived;
ptr->foo();
ptr->foo(1.0);
}
Вывод:
derived/no parameters
base/int
Как происходит при вызове foo()
, C ++, кажется, распознает, что он указывает на Derived
, но в вызове foo(1.0)
, C ++ не видит функцию void foo(double a)
в классе Derived
?
В моем представлении есть конкурирующие идеи, что C ++ имеет полиморфизм, который объясняет первый вызов, но это разрешение перегрузки выполняется во время компиляции, которое объясняет второй вызов.