Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Invoking a base class constructor

Reply
Thread Tools

Invoking a base class constructor

 
 
Dominique
Guest
Posts: n/a
 
      11-15-2003
Suppose I have:

class A
{
A(int x, int y);
};

and
class B: public A
{
.... some declarations
};

then I try:
int s, t;
B bObject(s, t);

I get a compiler error (gcc) that no constructor of the form B(int&, int&)
exists. However, I would have expected that the constructor from class A
would be invoked (since B 'is a' A). Adding a B(int x, int y), and using
that to invoke A solves the problem.

Am I doing something wrong?

Thanks
Dominique


 
Reply With Quote
 
 
 
 
Ron Natalie
Guest
Posts: n/a
 
      11-15-2003

"Dominique" <NODOTd.b.g.e.n.e.r.a.l.0.1.LOSEDOTS@cogecoDOTca > wrote in message news:KIutb.2121$_%(E-Mail Removed)...

> I get a compiler error (gcc) that no constructor of the form B(int&, int&)
> exists. However, I would have expected that the constructor from class A
> would be invoked (since B 'is a' A). Adding a B(int x, int y), and using
> that to invoke A solves the problem.
>
> Am I doing something wrong?

Constructors don't get inheritted. The only constructors that exist for B
are the two implicitly generated ones:
B()
and B(const B&)

If you want one that takes two ints and passes them along as initailizers to
the A object you need to write:

B(int s, int t) : A(s,t) { }

Note that this will inhibit the creation of the B() constructor. If you need one, you
will have to provide it.


 
Reply With Quote
 
 
 
 
amit gulati
Guest
Posts: n/a
 
      11-15-2003
Ron Natalie wrote:
> "Dominique" <NODOTd.b.g.e.n.e.r.a.l.0.1.LOSEDOTS@cogecoDOTca > wrote in message news:KIutb.2121$_%(E-Mail Removed)...
>
>
>>I get a compiler error (gcc) that no constructor of the form B(int&, int&)
>>exists. However, I would have expected that the constructor from class A
>>would be invoked (since B 'is a' A). Adding a B(int x, int y), and using
>>that to invoke A solves the problem.
>>
>>Am I doing something wrong?

>
> Constructors don't get inheritted. The only constructors that exist for B
> are the two implicitly generated ones:
> B()
> and B(const B&)
>
> If you want one that takes two ints and passes them along as initailizers to
> the A object you need to write:
>
> B(int s, int t) : A(s,t) { }
>
> Note that this will inhibit the creation of the B() constructor. If you need one, you
> will have to provide it.
>
>


That is not completely true, constructors do get inherited. The problem
with the code is that, since class A defines a non default cnstructor
A(int, int) the compiler does not generate a default constructor. Hence,
A() doesnot exist.

In B(int, int), since you are not explicitly calling A(int, int), the
compiler internally (while compiling) adds A() to the B(int, int)
constructor. But A() doesnot exists, hence you get the error message.

Good explanation of this phenomenon is present in the excellent book
"C++ object model" by Stanley lippman.

 
Reply With Quote
 
Ron Natalie
Guest
Posts: n/a
 
      11-15-2003

"amit gulati" <(E-Mail Removed)> wrote in message news:bp602l$7dj$(E-Mail Removed)...

> That is not completely true, constructors do get inherited.


No they don't. They have no name, they don't participate in lookup, so how
does the C++ notion of inheritance.

> The problem
> with the code is that, since class A defines a non default cnstructor
> A(int, int) the compiler does not generate a default constructor. Hence,
> A() doesnot exist.


This wasn't what he was asking. He wanted to know why he could construct
a B with two ints. The reason is that there is no B constructor that takes two
ints. Go back and read the original post.


 
Reply With Quote
 
Rolf Magnus
Guest
Posts: n/a
 
      11-16-2003
amit gulati wrote:

> That is not completely true, constructors do get inherited.


No, they don't.

> The problem with the code is that, since class A defines a non default
> cnstructor A(int, int) the compiler does not generate a default
> constructor. Hence, A() doesnot exist.


Right.

> In B(int, int),


B(int, int) doesn't exist.

> since you are not explicitly calling A(int, int), the
> compiler internally (while compiling) adds A() to the B(int, int)
> constructor. But A() doesnot exists, hence you get the error message.


He didn't get an error message that A() doesn't exist, but one that
B(int, int) doesn't exist, which is true.
Just try out what happens if you add a default constructor to A.
According to your explanation, it should work then.

> Good explanation of this phenomenon is present in the excellent book
> "C++ object model" by Stanley lippman.


Never heared of that book. Seems that it belongs on the
not-to-be-recommended list.

 
Reply With Quote
 
amit gulati
Guest
Posts: n/a
 
      11-17-2003
amit gulati wrote:
> Ron Natalie wrote:
>
>> "Dominique" <NODOTd.b.g.e.n.e.r.a.l.0.1.LOSEDOTS@cogecoDOTca > wrote in
>> message news:KIutb.2121$_%(E-Mail Removed)...
>>
>>
>>> I get a compiler error (gcc) that no constructor of the form B(int&,
>>> int&)
>>> exists. However, I would have expected that the constructor from class A
>>> would be invoked (since B 'is a' A). Adding a B(int x, int y), and using
>>> that to invoke A solves the problem.
>>>
>>> Am I doing something wrong?

>>
>>
>> Constructors don't get inheritted. The only constructors that exist
>> for B
>> are the two implicitly generated ones:
>> B()
>> and B(const B&)



What I mean by inherited is that in class B you can call A's
constructors, doesn't that mean that the constructors are inherited. I
never said that if you define A(int, int) then the compiler will
generate B(int, int).

Inheritance means that the properties (data and functions) of the base
class are available to the sub class as if they were it's own.

Hence anywhere in B I can call A(int, int), this shows that the
constructor A(int, int) is inherited.

I agree I did not read the problem that the person had completely. But
the fact is constructors are inherited.

>>
>> If you want one that takes two ints and passes them along as
>> initailizers to
>> the A object you need to write:
>>
>> B(int s, int t) : A(s,t) { }
>>
>> Note that this will inhibit the creation of the B() constructor. If
>> you need one, you
>> will have to provide it.
>>
>>

>
> That is not completely true, constructors do get inherited. The problem
> with the code is that, since class A defines a non default cnstructor
> A(int, int) the compiler does not generate a default constructor. Hence,
> A() doesnot exist.
>
> In B(int, int), since you are not explicitly calling A(int, int), the
> compiler internally (while compiling) adds A() to the B(int, int)
> constructor. But A() doesnot exists, hence you get the error message.
>
> Good explanation of this phenomenon is present in the excellent book
> "C++ object model" by Stanley lippman.
>


 
Reply With Quote
 
Ron Natalie
Guest
Posts: n/a
 
      11-17-2003

"amit gulati" <(E-Mail Removed)> wrote in message news:bpak8q$a11$(E-Mail Removed)...
=
> What I mean by inherited is that in class B you can call A's
> constructors, doesn't that mean that the constructors are inherited.


Well, you're still wrong. You can't call constructors at all.

> Inheritance means that the properties (data and functions) of the base
> class are available to the sub class as if they were it's own.


Which does not happen for constructors.

> Hence anywhere in B I can call A(int, int), this shows that the
> constructor A(int, int) is inherited.


You can't call A(int,int) anywhere. You can't call constructors.



 
Reply With Quote
 
amit gulati
Guest
Posts: n/a
 
      11-17-2003
Ron Natalie wrote:

> "amit gulati" <(E-Mail Removed)> wrote in message news:bpak8q$a11$(E-Mail Removed)...
> =
>
>>What I mean by inherited is that in class B you can call A's
>>constructors, doesn't that mean that the constructors are inherited.

>
>
> Well, you're still wrong. You can't call constructors at all.
>
>
>>Inheritance means that the properties (data and functions) of the base
>>class are available to the sub class as if they were it's own.

>
>
> Which does not happen for constructors.
>
>
>>Hence anywhere in B I can call A(int, int), this shows that the
>>constructor A(int, int) is inherited.

>
>
> You can't call A(int,int) anywhere. You can't call constructors.
>
>
>

OOps! I messed up again.
Refered to the C++ annotated reference manual page 263

"Constructors are not inherited"

Thanks for clearing my doubts.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Invoking base constructor Lilith C++ 1 12-12-2007 09:57 PM
call base class constructor from derived class constructor Rahul C++ 16 11-07-2007 03:40 PM
Calling base class constructor from derived class Copy constructor ali C++ 4 03-05-2007 09:15 AM
Invoking A Base class constructor hurcan solter C++ 3 01-12-2007 02:35 PM
Invoking templatized base class constructor from templatized derived class constructor mrstephengross C++ 5 05-18-2005 07:12 PM



Advertisments