Вызов виртуального метода.
От: Аноним  
Дата: 24.09.03 12:30
Оценка:
Здравствуйте.
Возник вот такой вопрос: есть следующий класс

class Class1
{
public:
   Class1();
   virtual ~Class1();

   virtual void Method1() { Method2(); };
   virtual void Method2() = 0;
};


От него наследован другой класс:
class Class2 : public Class1
{
public:
   Class2();
   virtual ~Class2();

   virtual void Method2() {};
};


Создаем объект второго класса и вызываем Method2

Class2 objClass2;
objClass2.Method1();


Внутри метода Method1 происходит вызов Method2, на этой строчке происходит "Pure virtual function call", так как вызывается метод Class1:Method2, а не Class2:Method2. Можно ли обойти как-то эту проблему и вызывать Class2:Method2?

Заранее благодарен.
Re: Вызов виртуального метода.
От: Bell Россия  
Дата: 24.09.03 12:39
Оценка:
Здравствуйте, Аноним, Вы писали:

Этот код не содержит ошибок (за исключением того, что в обоих классах объявлены но не определены конструкторы и деструкторы).
VC6 SP5:

#include <iostream>
class Class1
{
public:
   Class1(){}
   virtual ~Class1(){}

   virtual void Method1() { Method2(); };
   virtual void Method2() = 0;
};

class Class2 : public Class1
{
public:
   Class2(){}
   virtual ~Class2(){}

   virtual void Method2() 
   {
      std::cerr << "Class2::Method2()" << endl;
   };
};

int main()
{
   Class2 objClass2;
   objClass2.Method1(); 
    
   return 0;
}


Вывод:
Class2::Method2()
Любите книгу — источник знаний (с) М.Горький
Re: Вызов виртуального метода.
От: Lorenzo_LAMAS  
Дата: 24.09.03 12:40
Оценка:
Почему ты решил, что происходит вызов чисто виртуальной функции? Это не так.
Of course, the code must be complete enough to compile and link.
Re: Вызов виртуального метода.
От: piAnd Россия  
Дата: 24.09.03 12:41
Оценка:
Здравствуйте, Аноним, Вы писали:

class Class2 : public Class1
{
public:
   Class2();
   virtual ~Class2();
   
   virtual void Method1() {Method2 ();};
   virtual void Method2() {};
};

например
Re[2]: Вызов виртуального метода.
От: Bell Россия  
Дата: 24.09.03 12:46
Оценка:
Здравствуйте, Bell, Вы писали:

На всякий случай проверь, нет ли разницы в сигнатуре Method2 в обоих классах.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Вызов виртуального метода.
От: Аноним  
Дата: 24.09.03 12:53
Оценка:
Дополнительное копание показало, что падает только в одном случае, когда вызов происходит в конструкторе:

Class1::Class1()
{
   Method1();
}



Class2::Class1()
: Class1()
{
}
Re: Вызов виртуального метода.
От: jazzer Россия Skype: enerjazzer
Дата: 24.09.03 12:54
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.

А>Возник вот такой вопрос: есть следующий класс

А>
А>class Class1
А>{
А>public:
А>   Class1();
А>   virtual ~Class1();

А>   virtual void Method1() { Method2(); };
А>   virtual void Method2() = 0;
А>};
А>


А>От него наследован другой класс:

А>
А>class Class2 : public Class1
А>{
А>public:
А>   Class2();
А>   virtual ~Class2();

А>   virtual void Method2() {};
А>};
А>


А>Создаем объект второго класса и вызываем Method2


А>
А>Class2 objClass2;
А>objClass2.Method1();
А>


А>Внутри метода Method1 происходит вызов Method2, на этой строчке происходит "Pure virtual function call", так как вызывается метод Class1:Method2, а не Class2:Method2. Можно ли обойти как-то эту проблему и вызывать Class2:Method2?


А>Заранее благодарен.


У тебя точно вызов Method1 происходит так, как ты написал, а не из конструктора/деструктора?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Вызов виртуального метода.
От: alexandrov_alex США  
Дата: 24.09.03 13:03
Оценка:
Здравствуйте, , Вы писали:

> Дополнительное копание показало, что падает только в одном случае, когда

> вызов происходит в конструкторе:
>
>
 > Class1::Class1()
 > {
 >    Method1();
 > }
 >

>
>
 > Class2::Class1()
 > : Class1()
 > {
 > }
 >


Несчастный! Сейчас тебе очень много народа объяснит, что ты неправ и из конструктора полиморфные вызовы не осуществляются...

-- Всего хорошего!
-- Alex Alexandrov, e-mail: alexandrov_alex@fromru.com
Posted via RSDN NNTP Server 1.7 "Bedlam"
It's kind of fun to do the impossible (Walt Disney)
Re[4]: Вызов виртуального метода.
От: Bell Россия  
Дата: 24.09.03 13:08
Оценка:
Здравствуйте, Аноним, Вы писали:

Эээ батенька, да Вы никак поместили вызов виртуальной функции в конструктор
Подробности например здесь
Автор: ZZTop
Дата: 18.09.03
Любите книгу — источник знаний (с) М.Горький
Re: Вызов виртуального метода.
От: Аноним  
Дата: 24.09.03 13:09
Оценка:
Всем спасибо, ошибку понял...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.