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.

★★

Последнее исправление: Northsoft (всего исправлений: 2)

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

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

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

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

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

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

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

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

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

anonymous
()

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

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

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

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

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

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

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

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

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

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