5

Is there a way to force a derived class to use the constructor of the abstract base class? It must not be a real constructor, I have an open mind about creative solutions.

class Abstract { private: int Member; string Text; public: Abstract(int Member, string Text) { this->Member = Member; this->Text = Text; } // e.g. defining virtual functions } 

For example my abstract class has some private members which every derived class should also have. And they should be defined in the constructor, even against the will of the derived class.

I am aware that constructors are not inherited. But is there a workaround to produce a similar behavior?

3
  • 3
    Not defining default constructor forces derived classes to use any other constructor. Commented Oct 8, 2012 at 14:21
  • 2
    It's not clear what the question is. Any class that's derived from Abstract must use the one and only constructor in Abstract. Commented Oct 8, 2012 at 14:25
  • Just don't create any constructors that don't do what you want. Since the derived class instances are instances of the base class, a constructor must get called. There's nothing special you need to do. Commented Oct 8, 2012 at 14:29

2 Answers 2

23

As suggested by other users, you must call the base class constructor into the initializer list of derived class constructor.

But there's another cool solution bringed up by C++11: the inherited constructors:

class Base { Base(int Member, string Text) { }; }; class Derived : public Base { using Base::Base; // <-- Brings to derived the Base's constructor. }; 

But you must assure that your compiler can use C++11 features; and of course, study if the inherited constructor conforms to your requirements instead of using it just because it's cool.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for this nice addition!
10

Use initializer list of the derived class' constructor.

class Base { Base(int Member, string Text) { //... } }; class Derived : public Base { Derived(int Member, string Text) : Base(Member, Text) { // ^^^^^^^^^^^^^^^^^^ // ... } }; 

5 Comments

This si a valid remark but I don’t think it answers OP’s question.
This approach came to my mind already, but it isn't what I am looking for. Because the derived class don't have to use the initializer list. Moreover it would be confusing with five or more parameters.
@KonradRudolph The question was "Is there a way to force a derived class to use the constructor of the abstract base class?" That sure enough forces the use of a Base-class constructor.
@Robᵩ Well yeah, but so does OP’s code already. The point is that nothing in this answer explains that. See OP’s comment just above yours.
@sharethis - yes, the derived class does have to use the initializer list. If it doesn't, then no valid Base constructor is called, which is illegal.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.