-
September 9th, 2005, 05:37 AM
#1
C++: why pure virtual function has definition?Please look into sample code here
Actually pure virtual funtion should n't have implementation (viod Fun( ) = 0). Also this function cannot be called in derived class. Please look at the sample code.Here the class Base has pure virutual function, But it is allowing to have definition, even it can be called from drived class. There is no compilation error and Run time error. why? Anyone Can please give details about it?
Is there any special purpose to allow this?
#include <iostream.h>
class Base
{
public:
virtual void Fun( )=0
{
cout<<"\n I am in Pure virtual function\n";
}
};
class Derived:Public Base
{
public:
void Fun()
{
cout<<"\n I am in the Derived class";
Base::Fun( );
}
};
void main()
{
Derived d;
Base *b = &d;
b->Fun();
}
Regards,
Rameshkanth
BORN TO WIN
-
September 9th, 2005, 05:55 AM
#2
Re: C++: why pure virtual function has definition?Please look into sample code here
A pure virtual function can have a body. Why? Because the purpose of the "pure virtual" is to force instantiable children classes to implement it.
Har Har
-
September 9th, 2005, 06:02 AM
#3
Re: C++: why pure virtual function has definition?Please look into sample code here
If I remember well, somewhere in "Effective C++" Meyers mentions a reason for a pure virtual function to have a body:
Derived classes that implement this pure virtual function may call this implementation smwhere in their code.
If part of the code of two different derived classes is similar then it makes sense to move it up in the hierarchy, even if the function should be pure virtual.
Extreme situations require extreme measures
-
September 9th, 2005, 06:17 AM
#4
Re: C++: why pure virtual function has definition?Please look into sample code here
Thanks for your quick response. I agree with your point that the pure virtual function purpose is to force the derived class to override it.
But my doubt if we are able to call that function from the derived classes, why are we not allowed to create an object for that class and call that function with that object.
Regards,
Rameshkanth
BORN TO WIN
-
September 9th, 2005, 06:27 AM
#5
Re: C++: why pure virtual function has definition?Please look into sample code here
Originally Posted by ksrameshkanth
But my doubt if we are able to call that function from the derived classes, why are we not allowed to create an object for that class and call that function with that object.
Using implementation code from a base class has nothing to do with allowing creation of objects of the base class. These are totally unrelated.
When designing ask yourself:
- Do I need to be able to instantiate objects of the base class? If not the base class should be abstract (contains at least one pure virtual function).
- Is there common code that derived classes may want to use? Then consider providing this in the body of a pure virtual function.
Extreme situations require extreme measures
-
September 9th, 2005, 06:30 AM
#6
Re: C++: why pure virtual function has definition?Please look into sample code here
Purpose of a Pure Virtual Function is to make a Class to Abstract Class.
Often in a design, you want the base class to present only an interface for
its derived classes. That is, you don’t want anyone to actually create an
object of the base class, only to upcast to it so that its interface can be
used. This is accomplished by making that class abstract, which happens if
you give it at least one pure virtual function. You can recognize a pure
virtual function because it uses the virtual keyword and is followed by = 0.
If anyone tries to make an object of an abstract class, the compiler
prevents them. This is a tool that allows you to enforce a particular design.
When an abstract class is inherited, all pure virtual functions must be
implemented, or the inherited class becomes abstract as well. Creating a
pure virtual function allows you to put a member function in an interface
without being forced to provide a possibly meaningless body of code for
that member function. At the same time, a pure virtual function forces
inherited classes to provide a definition for it.
-
September 9th, 2005, 06:42 AM
#7
Re: C++: why pure virtual function has definition?Please look into sample code here
If you have a "normal" virtual function, its implementation (body) becomes a sort of "default" implementation. That is, derived classes will inherit that implementation and use it if they don't override the function. This may or may not be a problem if the author of a derived class forgets to override a particular virtual function.
By making the original function pure (but still with a body), you are saying to the author of a derived class "there's a default implementation of this function; if you want to use, you will have to be explicit about it".
Code:
class base
{
public:
virtual void f() = 0;
};
void base::f()
{
// implementation
}
class derived : public base
{
public:
virtual void f()
{
base::f(); // explicit use of default implementation
}
};
Correct is better than fast. Simple is better than complex. Clear is better than cute. Safe is better than insecure.
-- Sutter and Alexandrescu, C++ Coding Standards
Programs must be written for people to read, and only incidentally for machines to execute.
-- Harold Abelson and Gerald Jay Sussman
The cheapest, fastest and most reliable components of a computer system are those that aren't there.
-- Gordon Bell
-
September 9th, 2005, 08:13 AM
#8
Re: C++: why pure virtual function has definition?Please look into sample code here
Well, the point has already been made. But some additions and a question at the end. There is a case where it becomes a necessity to provide the implementation for a pure virtual functions and that would be a pure virtual destructor.
ISO C++ 12.4 (7):
A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined. If a class has a base class with a virtual destructor, its destructor (whether user or implicitly declared) is virtual.
Also, its not that since it has a body you need to call it explicitly. Its the other way round. If it needs to be called, then its body need to be implemented. The standard states it clearly:
ISO C++ 10.4 (2):
A pure virtual function need be defined only if explicitly called with the qualified id syntax (5.1).
And hence when the call from the derived destructor is done while polymorphic destruction you need to have a body of the base pure virtual destructor implemented for it to be executed while Base's destruction.
And now the question - Danny Kalev - here says that the body of the pure virtual destructor should always be empty. I could not get why does he say so? Comeau allows this. VC++ allows this. And standard doesnt have any mention to it. Is this something wrong that he has stated? Regards.
Last edited by exterminator; September 9th, 2005 at 08:18 AM.
Can you help me with my homework assignment?, Before you post!, Use code tags, How to post!, Codeguru technical FAQs, C++ FAQ Lite, Stroustrup: C++ Style and Technique FAQ, Guru of the Week, Comeau C and C++ FAQs, Comeau C++ Templates FAQs, CUJ @ DDJ, Spam threshold
My Blogs : Learning C++ is fun | Abnegator's reflections
Open Threads : C++ Aha! Moments | Nature of work in C++?
-
September 9th, 2005, 08:50 AM
#9
Re: C++: why pure virtual function has definition?Please look into sample code here
I would be happy with the statement if it's specified that he never puts data in an abstract class. Some people stick to this rule - I don't see the point of being that restrictive.
It comes down to whether you only ever use abstract classes to mimic "interfaces", or whether you see them as part of a broader picture, one that sees a use for abstract classes with state information.
Correct is better than fast. Simple is better than complex. Clear is better than cute. Safe is better than insecure.
-- Sutter and Alexandrescu, C++ Coding Standards
Programs must be written for people to read, and only incidentally for machines to execute.
-- Harold Abelson and Gerald Jay Sussman
The cheapest, fastest and most reliable components of a computer system are those that aren't there.
-- Gordon Bell
-
September 9th, 2005, 04:09 PM
#10
Re: C++: why pure virtual function has definition?Please look into sample code here
I already had abstract classes with a few fields, used by non-virtual methods who called other virtual methods.
I think that it is a restriction of the language to never put data in abstract classes, and it may need some duplicate code and data member... what is not good.
-
September 19th, 2013, 03:55 AM
#11
Re: C++: why pure virtual function has definition?Please look into sample code here
According to this link:
Pure Virtual function
"Having that implementation may be desirable when you think that classes which derive from the base class may need some sort of default behavior for the pure virtual function"
Also, an interesting piece of information:
"Pure virtual functions can not have a definition inside the function declaration", with the exception of Microsoft's visual C++.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|