riderchap
riderchap

Reputation: 687

What is special about the abstract class mechanism in C++?

I have question that bothers me for few days.

Abstract class is a special type of class that we cannot instantiate, right?. (Which is denoted/specified by giving a "= 0" to at least one method declaration, which looks like an afterthought).

What are the extra benefits that the abstract class mechanism brings to C++, that a 'normal' base class cannot achieve?

Upvotes: 3

Views: 1232

Answers (5)

Matthieu M.
Matthieu M.

Reputation: 300159

Don't think of it at the class level.

Look at the method, and think of what it should do in the default case:

virtual std::string getName() const = 0;

What would be a right implementation for this method ? There is none than I can think of.

By marking it "pure virtual", you ensure that if the user ever get an instance of a class derived from your interface, then this method will have a sensible behavior.

The only other way to do this would be a throw NotImplemented("getName"); body, but then you'd discover the issue at runtime, not at compile-time, which is not as nice :)

Upvotes: 0

Cratylus
Cratylus

Reputation: 54094

They are used as a base class in a class hierarchy design.
Abstract classes are used to define a clean interface for all derived classes.
At design stage, abstract classes define an interface, per specification and derived classes implement the desired functionality accordingly.
Also using abstract classes instead of "normal" classes helps separating the implementation details from the interface.
A concrete class implements an interface, but the abstract class defines it. You could use a concrete class as a base class in your design but abstract classes are not meant to be used directly in code and can not be instantiated. They serve as prototype.
By using the "normal" class as you say, you have to define an implementation for all methods.

Upvotes: 0

EboMike
EboMike

Reputation: 77762

It's the equivalent of what Java turned into "interfaces". Basically, it implies that the class itself is not usable - you need to override all pure methods.

An example is MFC's CView class which has a pure OnDraw method - the basic CView doesn't do anything and is as such useless. You have to override OnDraw.

(Btw - it is still possible to provide an implementation for a pure method, and subclassed implementations can fall back to it, but they still have to provide their own override.)

Upvotes: 1

Wyatt Anderson
Wyatt Anderson

Reputation: 9903

According to the wikibooks section on abstract classes:

It's a way of forcing a contract between the class designer and the users of that class. If we wish to create a concrete class (a class that can be instantiated) from an abstract class we must declare and define a matching member function for each abstract member function of the base class.

As mentioned, it's a way of defining an interface to which derived classes must adhere. Their example of the Vehicle abstract class is very apropos: you'd never have just a Vehicle in real life, you'd have a Ford Explorer or a Toyota Prius, but those both conform to (for the sake of argument) a base set of functionality that being a Vehicle might define. But, you can't just go to the Vehicle dealership and drive a Vehicle off the lot. Thus, you'd never want to be able to construct and use a base Vehicle object where you'd really want a specialized, derived object.

Upvotes: 7

Steve Townsend
Steve Townsend

Reputation: 54178

This offers the best way in C++ to define an interface without any default implementation.

C++ does not have C#'s interface concept.

Upvotes: 1

Related Questions