none
Вызов несуществующего метода RRS feed

  • Вопрос

  • Здравствуйте, вот:

    #include"stdafx.h"
    #include"iostream"
    using namespace std;
    class base{
    public:
     void a(){ cout << 1; }
    };
    class derived :public base{
    public:
     void a(){ cout << 2; }
    };
    int main(){
     base ob;
     derived *ptr;
     ptr = (derived*)(&ob);
     ptr->a();
     system("pause");
     return 0;
    }

    При запуске отображается 2 - почему? Ведь в классе base, метода void a(){ cout << 2; } вообще нет. Спасибо.



    31 марта 2015 г. 13:18

Ответы

  • Leontii, видимо Вы дошли до изучения виртуальных методов? Они здесь как раз могут помочь. Припишите ключевое слово virtual в объявлении метода base::a и получите требуемый результат.

    Результат 2 отображается потому, что у Вас работает раннее связывание. Компилятор создает код вызова метода, соответствующего типу указателя (derived) и не обращает внимания на его значение (т.к. компилятор о нем и не подозревает).


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    31 марта 2015 г. 13:47

Все ответы

  • Leontii, видимо Вы дошли до изучения виртуальных методов? Они здесь как раз могут помочь. Припишите ключевое слово virtual в объявлении метода base::a и получите требуемый результат.

    Результат 2 отображается потому, что у Вас работает раннее связывание. Компилятор создает код вызова метода, соответствующего типу указателя (derived) и не обращает внимания на его значение (т.к. компилятор о нем и не подозревает).


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    31 марта 2015 г. 13:47
  • Не, виртуальные методы я уже давно рассматривал, просто моя любовь к экспериментам всё не угасает)
    31 марта 2015 г. 14:07