Имея класс B, который расширяет класс A и переопределяет его функции, мы можем быть уверены, что при отправке экземпляра (B *), как если бы это был тип (A *), наши переопределения, созданные нами в классе B, будут называться?
Пока метод A определен как виртуальный, это будет иметь место как для указателей, так и для ссылок. Например
A
class A { virtual void Method() { cout << "A::Method" << endl; } }; class B { // "virtual" is optional on the derived method although some // developers add it for clarity virtual void Method() { cout << "B::Method" << endl; } }; void Example1(A* param) { param->Method(); } void Example2(A& param) { param.Method(); } void main() { B b; Example1(&b); // Prints B::Method Example2(b); // Prints B::Method }
Да, если функции объявлены virtual - см. http://www.parashift.com/c++-faq-lite/virtual-functions.html
virtual
Только если функция в A объявлена virtual. При объявлении virtual любые переопределенные дочерние функции вызываются даже при приведении в качестве родительского класса.