472,779 Members | 2,753 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

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

virtual vs pure virtual member function

Hi Everyone,

I wanted to know as to what is the exact difference between a virtual
function and a pure virtual function?
Thanks in advance!!!

Apr 30 '07 #1
7 24472
<sa*****@yahoo.co.inwrote in message
news:11**********************@q75g2000hsh.googlegr oups.com...
Hi Everyone,

I wanted to know as to what is the exact difference between a virtual
function and a pure virtual function?
Thanks in advance!!!
class MyClass
{
public:
virtual void MyFunction() { }; // Virtual
};

class MyDerived: public MyClass
{
};

That will compile.

class MyClass2
{
public:
virtual void MyFunction() = 0; // Pure Virtual
};

class MyDerived2: pubic MyClass2
{
};

That will not compile. Anything that derives from a class with a pure
virtual must override the method as none is defined.

A method needs to be virtual so the compiler will look for a derived
override in a base class. If a method is pure virtual, a derived class must
override the method.
Apr 30 '07 #2
On Apr 30, 9:31 am, sam_...@yahoo.co.in wrote:
Hi Everyone,

I wanted to know as to what is the exact difference between a virtual
function and a pure virtual function?
Thanks in advance!!!
If you declare a virtual function in a class say for example B, you
actually say: The function may be redefined in derived classes.

class B {
public:
virtual void f() { /* ... */ }
};

You define the f() for B and you usually redefine the function in
derived class:
class D : public B {
public:
void f() {/* another defintion */ }
};
virtual function is a primary tool for polymorphic bevaviour. If you
offer no defintion for D::f(), you will use the definition of B::f(),
because as an Inheritance principle, D inherited the public members of
B. Also you can declare f() in D as a virtual function, and the
redefinition process is continued in the classes that derived form D.
pure virtual function is a kind of virtual functions with a specific
syntax:
class B {
public:
virtual void f() =0; // =0 means pure virtual
};
if a class has at least one pure virtual function, it will be abstract
class, so instance creation is impossible. B::f() says you should
implement f() in derived classes:
class D : public B {
void f() { /* ... */ }
};
If you do not implement f() in D, the D is abstract class by default,
because it inherits all the pure virtual functions of class B.
for more detailed (and of course better) description, please see the
following references:
. C++ Standard Draft: Chapter 10
. The C++ Programming Language (3rd edition) by Bjarne Stroustrup:
Chapter 12.
. Design and Evolution of C++ by Bjarne Stroustrup: Chapter under
the title of "Class Concepts Refinements"

Regards,

Apr 30 '07 #3
On Apr 30, 7:31 am, sam_...@yahoo.co.in wrote:
I wanted to know as to what is the exact difference between a virtual
function and a pure virtual function?
A class which contains a pure virtual function is abstract, and
cannot be instantiated. A function call using dynamic
resolution results in undefined behavior if it would resolve to
a pure virtual function, and a pure virtual function is not
automatically considered "used", and so doesn't have to be
implemented unless it is actually called (e.g. by means of a
scope resolution operator, or implicitly from the destructor of
a derived class, if it is the destructor).

Thus:

class Base
{
public:
virtual void f() ; // Must be defined...
virtual void g() = 0 ;
virtual void h() = 0 ;

Base()
{
f() ; // calls Base::f()...
g() ; // undefined behavior...
Base::h() ; // calls Base::h, which
// must be defined.
}
} ;

Note that it is not necessary to defined Base::g() unless some
derived class calls Base::g().

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Apr 30 '07 #4
class MyClass
{
public:
virtual void MyFunction() { }; // Virtual

};

class MyDerived: public MyClass
{

};

That will compile.

class MyClass2
{
public:
virtual void MyFunction() = 0; // Pure Virtual

};

class MyDerived2: pubic MyClass2
{

};

That will not compile. Anything that derives from a class with a pure
virtual must override the method as none is defined.
No. It will compile. MyDerived2 will be an abstract class and you
cannot create an instance of it.
If a method is pure virtual, a derived class must
override the method.
Not necessarily, unless one wants to create an instance of the derived
class.

Apr 30 '07 #5
sa*****@yahoo.co.in wrote:
Hi Everyone,

I wanted to know as to what is the exact difference between a virtual
function and a pure virtual function?
Your question is actually a FAQ. You can find the answer at
http://www.parashift.com/c++-faq-lit...t.html#faq-5.2
Apr 30 '07 #6
Prashanth wrote:
>class MyClass
{
public:
virtual void MyFunction() { }; // Virtual

};

class MyDerived: public MyClass
{

};

That will compile.

class MyClass2
{
public:
virtual void MyFunction() = 0; // Pure Virtual

};

class MyDerived2: pubic MyClass2
{

};

That will not compile. Anything that derives from a class with a pure
virtual must override the method as none is defined.

No. It will compile. MyDerived2 will be an abstract class and you
cannot create an instance of it.
If it compiles for you, it means your compiler is broken. This is what I
get with gcc 4.1.2:

[zzz@cherry data_create]$ g++ jj.cpp -o jj
jj.cpp: In function ‘int main()’:
jj.cpp:13: error: cannot declare variable ‘a’ to be of abstract type
‘MyDerived2’
jj.cpp:8: note: because the following virtual functions are pure
within ‘MyDerived2’:
jj.cpp:4: note: virtual void MyClass2::MyFunction()

BTW there is a typo in the example. This is correct:

class MyClass2
{
public:
virtual void MyFunction() = 0;
};

class MyDerived2 : public MyClass2
{
};

int main()
{
MyDerived2 a;
}
>
> If a method is pure virtual, a derived class must
override the method.

Not necessarily, unless one wants to create an instance of the derived
class.
What is a point of a class, if it is not used??
May 1 '07 #7
On May 1, 3:25 pm, anon <a...@no.nowrote:
Prashanth wrote:
class MyClass
{
public:
virtual void MyFunction() { }; // Virtual
};
class MyDerived: public MyClass
{
};
That will compile.
class MyClass2
{
public:
virtual void MyFunction() = 0; // Pure Virtual
};
class MyDerived2: pubic MyClass2
{
};
That will not compile. Anything that derives from a class with a pure
virtual must override the method as none is defined.
No. It will compile. MyDerived2 will be an abstract class and you
cannot create an instance of it.
If it compiles for you, it means your compiler is broken.
The standard requires that it compile. It compiles with every
compiler I've ever used.
This is what I
get with gcc 4.1.2:
[zzz@cherry data_create]$ g++ jj.cpp -o jj
jj.cpp: In function ?int main()?:
jj.cpp:13: error: cannot declare variable ?a? to be of abstract type
?MyDerived2?
jj.cpp:8: note: because the following virtual functions are pure
within ?MyDerived2?:
jj.cpp:4: note: virtual void MyClass2::MyFunction()
Obviously, you've added some code which is illegal.
BTW there is a typo in the example. This is correct:
class MyClass2
{
public:
virtual void MyFunction() = 0;
};
class MyDerived2 : public MyClass2
{
};
int main()
{
MyDerived2 a;
Mainly, this. That wasn't in Prashanth's example, and in fact,
he explicitly said that it wasn't legal.
}
If a method is pure virtual, a derived class must
override the method.
Not necessarily, unless one wants to create an instance of the derived
class.
What is a point of a class, if it is not used??
Who said you cannot use it? You cannot create an instance of it
(as a full object, at any rate). You can still use it as a base
class, for further derivation, or use it in any context that
doesn't require an instance.
--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

May 2 '07 #8

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

Similar topics

11
by: santosh | last post by:
Hello, I was going through the Marshal Cline's C++ FAQ-Lite. I have a doubt regarding section 33.10. Here he is declaring a pure virtual destructor in the base class. And again defining...
37
by: WittyGuy | last post by:
Hi, I wonder the necessity of constructor and destructor in a Abstract Class? Is it really needed? ? Wg http://www.gotw.ca/resources/clcm.htm for info about ]
10
by: PengYu.UT | last post by:
Hi, A pure function is called in the base function constructor. It generate a run time error: "pure virtual method called". My problem is that class A have some derived classes. I want A's...
10
by: Martin Vorbrodt | last post by:
Example code in one of my books intrigues me: class B { public: B* Clone() const { B* p = DoClone(); assert(typeid(*p) == typeid(*this)); return p; }
6
by: pakis | last post by:
I am having a problem of pure virtual function call in my project. Can anyone explaine me the causes of pure virtual function calls other than calling a virtual function in base class? Thanks
2
by: Steven T. Hatton | last post by:
This is under the heading of "One Definition Rule" in the Standard, in a paragraph explaining what it means for an object or non-overloaded function to be 'used': "A virtual member function is used...
3
by: keith | last post by:
Dear mentors and gurus, I noticed at the end of section 22.4 of the 'FAQ-Lite' it says "Note that it is possible to provide a definition for a pure virtual function, but this usually confuses...
14
by: Jack | last post by:
Hi, I meet a question with it , I did not get clear the different betteen them, for example: #include <iostream>
13
by: Mike -- Email Ignored | last post by:
Is a pure virtual function in allowed in a template base class? In any case, I have one working. Am I skating on thin ice? Thanks, Mike.
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: kcodez | last post by:
As a H5 game development enthusiast, I recently wrote a very interesting little game - Toy Claw ((http://claw.kjeek.com/))。Here I will summarize and share the development experience here, and hope it...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...

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.