473,320 Members | 1,920 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 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 24515
<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.
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

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.