Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > __PureVirtualCalled

Reply
Thread Tools

__PureVirtualCalled

 
 
What Ever
Guest
Posts: n/a
 
      08-14-2003
Hi,

I got __PureVirtualCalled exception when I have defined a public
function in the base class, and its implementation calls number of
"pure virtual functions", which are overridden in the derived class.

For example

class Base
{
public:
void foo();
virtual ~Base();
private:
virtual void pure1() = 0;
virtual void pure2() = 0;
virtual void pure3() = 0;
};

void Base::foo()
{
pure1();
pure2();
pure3();
}

class Derived : public Base
{
private:
void pure1();
void pure2();
void pure3();
};

void Derived:ure1()
{
// do something
}

void Derived:ure2()
{
// do something
}

void Derived:ure3()
{
// do something
}

Can someone please explain to me why I would be getting
__PureVirtualCalled exception? Can't I call a pure virtual function
from the base class. BTW, as you have seen I did not provide any
implementation for the pure virtual in base class.

I'm using HP's aCC compiler.

Thanks in advance.
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      08-14-2003
"What Ever" <(E-Mail Removed)> wrote...
> I got __PureVirtualCalled exception when I have defined a public
> function in the base class, and its implementation calls number of
> "pure virtual functions", which are overridden in the derived class.
>
> For example
>
> class Base
> {
> public:
> void foo();
> virtual ~Base();
> private:
> virtual void pure1() = 0;
> virtual void pure2() = 0;
> virtual void pure3() = 0;
> };
>
> void Base::foo()
> {
> pure1();
> pure2();
> pure3();
> }
>
> class Derived : public Base
> {
> private:
> void pure1();
> void pure2();
> void pure3();
> };
>
> void Derived:ure1()
> {
> // do something
> }
>
> void Derived:ure2()
> {
> // do something
> }
>
> void Derived:ure3()
> {
> // do something
> }
>
> Can someone please explain to me why I would be getting
> __PureVirtualCalled exception?


Cannot tell. Where do you call 'foo'? From the c-tor?

> Can't I call a pure virtual function
> from the base class.


You can. The result depends on where the call originates.
If it originates from a constructor or the destructor, the
result is undefined.

> BTW, as you have seen I did not provide any
> implementation for the pure virtual in base class.


You can call a pure virtual function from the constructor, but
in that case the call will _not_ be polymorphic. The derived
class object, which overrides those functions, has not been
constructed yet, so the call is resolved statically. If you do
not have a definition (body) for the pure virtual function you
are trying to call from a c-tor, the behaviour is undefined.

It's basically like dereferencing a null pointer.

This is one of the most dramatic differences between C++ and
Java, for example. The latter allows calling virtual functions
from constructor and does that polymorphically. So, you end up
inside a member of the derived class when the derived object
hasn't even begun constructing! Yecch...

Victor


 
Reply With Quote
 
 
 
 
What Ever
Guest
Posts: n/a
 
      08-14-2003
http://www.velocityreviews.com/forums/(E-Mail Removed) (What Ever) wrote in message news:<(E-Mail Removed) om>...
> Hi,
>
> I got __PureVirtualCalled exception when I have defined a public
> function in the base class, and its implementation calls number of
> "pure virtual functions", which are overridden in the derived class.
>
> For example
>
> class Base
> {
> public:
> void foo();
> virtual ~Base();
> private:
> virtual void pure1() = 0;
> virtual void pure2() = 0;
> virtual void pure3() = 0;
> };
>
> void Base::foo()
> {
> pure1();
> pure2();
> pure3();
> }
>
> class Derived : public Base
> {
> private:
> void pure1();
> void pure2();
> void pure3();
> };
>
> void Derived:ure1()
> {
> // do something
> }
>
> void Derived:ure2()
> {
> // do something
> }
>
> void Derived:ure3()
> {
> // do something
> }
>
> Can someone please explain to me why I would be getting
> __PureVirtualCalled exception? Can't I call a pure virtual function
> from the base class. BTW, as you have seen I did not provide any
> implementation for the pure virtual in base class.
>
> I'm using HP's aCC compiler.
>
> Thanks in advance.



Victor, and David thanks for your time. No, I am not calling a virtual
function from the constructor. The problem was in my makefile, I
changed signatures of some of the functions, and that did not force
the recompilation of certain source files. I am guessing that caused
the problem, a complete re-build fixed it.

Thanks again.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments