Вызов виртуального метода.
От:
Аноним
Дата: 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: Вызов виртуального метода.
Почему ты решил, что происходит вызов чисто виртуальной функции? Это не так.
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 происходит так, как ты написал, а не из конструктора/деструктора?
Re[4]: Вызов виртуального метода.
Здравствуйте, , Вы писали:
> Дополнительное копание показало, что падает только в одном случае, когда
> вызов происходит в конструкторе:
>
> > 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
Оценка:
Всем спасибо, ошибку понял...
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить