URL: https://linuxfr.org/forums/programmation-c/posts/pure-virtual-method-called Title: Pure virtual method called Authors: Guillaume Ceccarelli Date: 2006年05月19日T12:16:29+02:00 Tags: Score: 0 Bonjour bonjour ! Ce petit message fait suite à une longue prise de tête. Après plusieurs heures à me demander pourquoi mon executable finissait avec un SIGABRT avec un joli message "pure virtual method called", j'ai enfin isolé le bug. Le soucis est que je n'ai aucune idée pour le résoudre de façon propre. Le problème est le suivant : Soient 3 classes telles que: class Base { public: £spaces£ £/spaces£Base() { £spaces£ £/spaces£Client* client=new Client; £spaces£ £/spaces£client->test(this); £spaces£ £/spaces£delete client; £spaces£ £/spaces£} £spaces£ £/spaces£virtual ~Base() {} £spaces£ £/spaces£virtual void pure() const=0; }; class Deriv:public Base{ public: £spaces£ £/spaces£Deriv():Base() { } £spaces£ £/spaces£virtual void pure() const { cout << "test réussi" << endl } £spaces£ £/spaces£virtual ~Deriv() {} }; class Client{ public: £spaces£ £/spaces£void test (Base* base) { £spaces£ £/spaces£base->pure(); £spaces£ £/spaces£} } Dans mon application réelle, client est singleton et je m'en sers à chaque fois qu'une classe dérivée est construite pour "l'enregistrer" au sein d'un catalogue. J'ai tout de suite eu l'idée d'implémenter cette fonctionnalité dans le constructeur de la classe de base. Le soucis est que lors de l'appel à ce constructeur, this est du type (class Base *), et que lorsqu'on appelle une méthode à partir de ce "this", le principe de polymorphisme n'est pas mis en place, et c'est la méthode de la classe de base qui est appelée en lieu et place de celle de la classe dérivée. Sachant que pour mon appli, j'ai besoin de faire cet appel de méthode, j'ai un peu de mal à imaginer une façon "propre" de sortir de ce bourbier. Des idées ? Merci d'avance ! PS. Le code est disponible sur : [http://lastrainson.info/bug.tar.gz](http://lastrainson.info/bug.tar.gz)

AltStyle によって変換されたページ (->オリジナル) /