__PureVirtualCalled

W

What Ever

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::pure1()
{
// do something
}

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

void Derived::pure3()
{
// 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.
 
V

Victor Bazarov

What Ever said:
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::pure1()
{
// do something
}

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

void Derived::pure3()
{
// 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
 
W

What Ever

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::pure1()
{
// do something
}

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

void Derived::pure3()
{
// 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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top