473,379 Members | 1,302 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,379 software developers and data experts.

Invoking a base class constructor

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
Jul 19 '05 #1
7 28963

"Dominique" <NODOTd.b.g.e.n.e.r.a.l.0.1.LOSEDOTS@cogecoDOTca > wrote in message news:KI******************@read1.cgocable.net...
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.
Jul 19 '05 #2
Ron Natalie wrote:
"Dominique" <NODOTd.b.g.e.n.e.r.a.l.0.1.LOSEDOTS@cogecoDOTca > wrote in message news:KI******************@read1.cgocable.net...

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.

Jul 19 '05 #3

"amit gulati" <am********@cox.net> wrote in message news:bp**********@news2.news.larc.nasa.gov...
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.
Jul 19 '05 #4
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.

Jul 19 '05 #5
amit gulati wrote:
Ron Natalie wrote:
"Dominique" <NODOTd.b.g.e.n.e.r.a.l.0.1.LOSEDOTS@cogecoDOTca > wrote in
message news:KI******************@read1.cgocable.net...

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.


Jul 19 '05 #6

"amit gulati" <am********@cox.net> wrote in message news:bp**********@news2.news.larc.nasa.gov...
=
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.

Jul 19 '05 #7
Ron Natalie wrote:
"amit gulati" <am********@cox.net> wrote in message news:bp**********@news2.news.larc.nasa.gov...
=
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.
Jul 19 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Lefevre | last post by:
Hello I recently had troubles with a class inheritance hierarchy. I solved it, but it didn't satisfied me. I found the solution using this forum :) Actualy i found the following message...
5
by: mrstephengross | last post by:
Ok, I've got code that looks something like this: ================================================== template<typename T1, typename T2> class Base { public: explicit Base(const T1 & t1) {...
3
by: J.J. Feminella | last post by:
(Please disregard the previous message; I accidentally sent it before it was completed.) I have source code similar to the following. public class Vehicle { protected string dataV; // ......
3
by: hazz | last post by:
The following classes follow from the base class ' A ' down to the derived class ' D ' at the bottom of the inheritance chain. I am calling the class at the bottom, "public class D" from a client...
6
by: Taran | last post by:
Hi All, I tried something with the C++ I know and some things just seem strange. consider: #include <iostream> using namespace std;
12
by: Hemanth | last post by:
Hi, I have a base class with a static constructor and some abstract methods. Derived classes implement these methods. From articles on the web, it appears that there is no guarentee that this...
3
by: hurcan solter | last post by:
Consider the code fragment; class A { public: A(){} A(int prm):mprm(prm){} int mprm; }; class B:public A {
26
by: nyathancha | last post by:
Hi, How Do I create an instance of a derived class from an instance of a base class, essentially wrapping up an existing base class with some additional functionality. The reason I need this is...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.