Stupid C++ question

Started by
15 comments, last by BradDaBug 21 years, 3 months ago
you can''t have virtual constructors because you actually have to name the constructor you are calling

ie Base* pB = new Derived();

will call the Derived constructor. This in it''s part will construct a Derived object which is made up of the Base object and anything additional the Derived class adds. The Base class constructor is automatically called before entering the body of the Derived class constructor.

You could have a ''clone'' base member function which is virtual and can be overidden in derived classes. That''s about as close as you''ll get to a virtual constructor in c++.

So given some object which could be anywhere down a class hierarchy you can do this:

Base* pb = someFunctionReturningAPointer();
Base* pNewB = pb->clone();

you could use templates to make the coding of this easier but I''ll leave that for you to work out.
Advertisement
I''m sorry. I must have read the book wrong.


tcache
Contact Me
-----------
AH! MY BRAIN IS GOING TO SELF-DETONATE! -- Yours Truly (Jan, 2003)
tcacheContact Me-----------AH! MY BRAIN IS GOING TO SELF-DETONATE! -- Yours Truly (Jan, 2003)
Also, with this code

B::B() : A() { std::cout << "Constructing class B...\n"; } 


If you wanted to initialize stuff after if with other variables ect., would you go like this?

B::B() : A() { std::cout << "Constructing class B...\n"; }, int a(_a), int b(_b)?Is this a rare instance in where a , follows a }?    



tcache
Contact Me
-----------
AH! MY BRAIN IS GOING TO SELF-DETONATE! -- Yours Truly (Jan, 2003)
tcacheContact Me-----------AH! MY BRAIN IS GOING TO SELF-DETONATE! -- Yours Truly (Jan, 2003)
quote:Original post by Tazel
If you wanted to initialize stuff after if with other variables ect., would you go like this?
B::B() : A() { std::cout << "Constructing class B...\n"; }, int a(_a), int b(_b)? 

Is this a rare instance in where a , follows a }?
No it''s not (I don''t think there is such instance). You''re on the right track, though. Other member variables can be initialized before the constructor is entered, but I cannot imaging why you would want to initialize them after the constructor.
class A { public: A(int arg); ~A(); private: int data; }; class B : public A{public:  B(int base_arg, int our_arg);         ~B();private: int our_data;}; B::B(int base_arg, int our_arg): A(base_arg), our_data(our_arg){    // To have our_data in the initializer list, is equivalent of:    our_data = our_arg; // <-- now redundant    // blah...} 


quote:B::B() : A() { std::cout << "Constructing class B...\n"; }, int a(_a), int b(_b)


can''t do it (doesn''t compile)

The initialisation list that comes after the constructor is only allowed before the main function.

B::B(int _a, int _b) : A(), a(_a), b(_b)// i assume a and b are members of B
{
//main body
}
So you have to the the function last. Then is the body of the constructor the body of the function?


tcache
Contact Me
-----------
AH! MY BRAIN IS GOING TO SELF-DETONATE! -- Yours Truly (Jan, 2003)
tcacheContact Me-----------AH! MY BRAIN IS GOING TO SELF-DETONATE! -- Yours Truly (Jan, 2003)
quote:Original post by Tazel
So you have to the the function last. Then is the body of the constructor the body of the function?
I don''t understand your question really, but read this part of Thinking in C++ by Bruce Eckel.

This topic is closed to new replies.

Advertisement