473,395 Members | 2,446 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,395 software developers and data experts.

__PureVirtualCalled

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.
Jul 19 '05 #1
2 2528
"What Ever" <my***********@yahoo.com> 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::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
Jul 19 '05 #2
my***********@yahoo.com (What Ever) wrote in message news:<fe*************************@posting.google.c 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::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.
Jul 19 '05 #3

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

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.