Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множетвенное наследование, Объясните, почему так происходит 
:(
    Опции темы
Brain89
Дата 1.12.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.1.2010

Репутация: нет
Всего: 2



Есть следующая иерархия классов (MSVS):
Код

__interface IA
{
    public:            
        virtual void Method_A() = 0;
};
class B: public IA
{
    public:            
        B();            
        virtual ~B();

        void Method();
        virtual void Method_B() = 0;
    private:
        <data>            
       virtual void Method_A();
            
};
class C: public IA, public B
{
    public:            
        C();
        ~C();            
           
        virtual void Method_B();
        virtual void Method_A();
    private:
        <data>                    
};

В методе void C::Method_B(); есть такой код:
Код

C::Method_B()
{
    this->Method();
}

Т.е. вызываю метод, определенный в классе B и наследованный классом C. В реализации этого метода (void B:: Method()) есть вызов:
Код

void B:: Method()
{
    this->Method_A();
}

Т.е. хочу вызвать метод, наследованный классом B от класса IA и переопределенный в классе B. Но происходит вызов метода C::Method_A(). Почему так и как это исправить?
PM   Вверх
baldina
Дата 1.12.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата

Почему так

потому что Method_A() виртуальная

Цитата

как это исправить

если в B:: Method() требуется всегда вызывать B::Method_A(), это надо указать явно:
Код

void B:: Method() {
    B::Method_A();
}

PM MAIL   Вверх
Brain89
Дата 1.12.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.1.2010

Репутация: нет
Всего: 2



baldina
Меня больше интересует, почему именно так происходит. 

Если я все верно понимаю, то при вызове C::Method_B() происходит вызов C::Method_B(). Так как этот метод принадлежит классу C, то и при его реализации указатель this является указателем на объект класса C. Поэтому, когда в я вызываю Method, то вызов происходит такой: C::B::Method(). Когда же вызываю Method_A в классе B, то получается, что на самом деле C::Method_A(), а не C::B::Method_A()? И решается это только явным указанием, какую реализацию вызвать в теле класса B? 
PM   Вверх
baldina
Дата 1.12.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



это полиморфизм. тип объекта определяется динамически, и вызывается правильная функция. т.е. когда вызов происходит внутри B::Method(), настоящий тип объекта - С. поскольку Method_A() виртуальная, происходит поиск соответствующей функции, т.е. C::Method_A();
посмотрите еще вот такой пример: http://liveworkspace.org/code/f7c7d636fd4b...32ae1b24ce294c5

вообще полиморфное поведение в С++ означает, что при работе с указателем на базовый класс, виртуальные функции вызываются с учетом истинного производного типа.
пример общего характера:
http://codepad.org/hIl6E3ei

Добавлено через 2 минуты и 39 секунд
кстати множественное наследование в данном случае не причем.
PM MAIL   Вверх
Brain89
Дата 1.12.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.1.2010

Репутация: нет
Всего: 2



baldina
Спасибо. Теперь понял.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.