From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5207 invoked by alias); 22 Nov 2001 18:01:14 -0000 Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org Received: (qmail 5164 invoked from network); 22 Nov 2001 18:01:12 -0000 Received: from unknown (HELO host3.grouplogic.com) (209.183.196.3) by sourceware.cygnus.com with SMTP; 22 Nov 2001 18:01:12 -0000 Received: from localhost (rob@localhost) by host3.grouplogic.com (8.9.3/8.9.3) with ESMTP id MAA12759; Thu, 22 Nov 2001 12:58:25 -0500 X-Authentication-Warning: host3.grouplogic.com: rob owned process doing -bs Date: Thu, 15 Nov 2001 18:19:00 -0000 From: Rob Newberry X-Sender: rob@host3.grouplogic.com To: Eddy Ilg cc: gcc-help@gcc.gnu.org Subject: Re: C++ - Calling virtual function from constructor In-Reply-To: <000c01c1735c$33131a80$6300a8c0@Freedom> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2001-11/txt/msg00130.txt.bz2 > Why can I not or how could I call a virtual function from the > contstructor? I don't know about the specifics of you're trying to do (you may be safe), and I think it may depend on your compiler (and I don't know what g++ does), BUT... The reason you don't call virtual methods inside a constructor is because you don't know what kind of object you are -- while you're in the process of being constructed, you're still in a _somewhat_ indeterminate state. Only after you are constructed are you a real object. Here's an example: class a { public: a(); virtual void v_meth(); }; class b : public a { public: b(); virtual void v_meth(); }; a::a() { // this will _always_ call a::v_meth, because // at this point, that's what we are -- even // if we're in the process of constructing a // subclass of class a v_meth(); } void a::v_meth() { printf("a::v_meth\n"); } b::b() { // likewise, this will always call b::v_meth, // because at this point, that's what we are v_meth(); } void b::v_meth() { printf("b::v_meth\n"); } main() { printf("constructing an a:\n"); a an_a; printf("constructing a b:\n"); b a_b; } The output of this, with gcc, is: constructing an a: a::v_meth constructing a b: a::v_meth b::v_meth As you can see, when you are constructing the 'b' object a_b, the constructor for 'a' and 'b' get called in succession. But the constructor for 'a' calls 'v_meth', it ONLY calls the 'a' method, because at that point, that's all the object it is. This might not be the behavior you want to have, since you're constructing a 'b' object. That's why the compiler complains about you calling a virtual method in a constructor. Rob --------------------------------------------------------------------- Rob Newberry Director of Fajita Technology Group Logic, Inc.