LINUX.ORG.RU

Виртуальный метод вызывается из реализации родителя, а не потомка

 , ,


0

1

cat virtuals.cpp

class Animal {
 public:
 virtual void voice(){ std::cout << "Йа живтоне" << std::endl; }
 Animal(){ this->voice(); }
};

class Cat: public Animal {
 public:
 virtual void voice(){ std::cout << "Йа котэ" << std::endl; }
 Cat(): Animal() {}
};

int main(){
 std::cout << "Создаём животное: " ; Animal animal;
 std::cout << "Создаём котейку: "; Cat cat;
 return 0;
}

g++ -ansi -pedantic -Wall -o virtuals virtuals.cpp && ./virtuals

Создаём животное: Йа живтоне
Создаём котейку: Йа живтоне


Вопрос: как заставить конструктор родителя вызывать виртуальный метод как виртуальный, перегруженный в потомке, а не как прибитый гвоздями к конкретному родительскому классу?
Буду благодарен за ссылку на нужный пункт N3337.

Animal(){ this->voice(); }

Типичная ошибка. Не работают виртуальные методы, вызванные из конструктора, так, как вы хотите.

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

Ненавижу C++

Всем спасибо, тема закрыта. И да, Java — ня. :3

Northsoft ★★ ()
Ответ на: Ненавижу C++ от Northsoft

Решается разделением конструкции объекта и его инициализации (костыль, но если это действительно надо, и если ограничить создание объекта фабрикой, то сойдет).

yoghurt ★★★★★ ()

Ты пытаешься вызвать метод класса объекта, который ещё не создан. Успехов)

nanoolinux ★★★★ ()
Ответ на: Ненавижу C++ от Northsoft

Re: Ненавижу C++

Ненавижу логику

Fixed. Нельзя трогать дочерний объект, когда он ещё не сконструирован - это должно быть очевидно ребёнку. И никак не зависит от языка.

slovazap ★★★★★ ()
Ответ на: Ненавижу C++ от Northsoft

Re: Ненавижу C++

В Java это как раз неверное поведение. На каком-нибудь собеседовании тебя могут спросить о возможных негативных последствиях ;)

anonymous ()

прочитал так: виртуальный метод вызывает родителей потомка в школу

anonymous ()
Ответ на: Ненавижу C++ от Northsoft

Re: Ненавижу C++

ты и правда необразованное животное

anonymous ()
Ответ на: комментарий от nanoolinux

вы, товарищ, вольно обращаетесь с терминами. объект как раз создан, но не инициализирован до конца конструктором.

anonymous ()
Ответ на: комментарий от anonymous

Нет. Объект создан(сконструирован) тогда, когда закончил работать конструктор

anonymous ()
Ответ на: комментарий от anonymous

Мне кажется, что это вы со своим уставом в чужой монастырь. В C++ объект создаётся конструктором. Конструктор отработал - объект(часть объекта в случае конструктора базового класса) готов. До этого момента объекта нет(даже деструктор вызван не будет в случае исключения в конструкторе).

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.