Почему вызывается метод базового класса, если производный класс переопределяет метод?

рассмотрим следующую программу:

class Base {
public:
    virtual void foo() const {
        cout << "Base::foo()" << endl;
    }
};

class Derived : public Base {
public:
    virtual void foo() {
        cout << "Derived::foo()" << endl;
    }
};

void func(Base& obj) {
    obj.foo();
}

void main() {
    Derived d;
    func(d); // Base::foo() is printed 
}

Если я удалю const из метода Base класса foo , тогда ] Вызывается Derived :: foo () . Кажется, я не могу понять это поведение.

1) В чем причина такого поведения?

2) Это решено во время компиляции или выполнения?

Спасибо

6
задан dankilman 10 June 2011 в 15:34
поделиться