cerenoc wrote:
I am fairly new to polymorphism with c++ and am having trouble
figuring out an error message. I narrowed it down to the following
simple example:
------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
class Base {
int temp1;
//string temp2;
public:
virtual void whoami() = 0;
};
class Derived1 : public Base {
public:
virtual void whoami() {
cout << "== Derived1 ==" << endl;
}
};
class Derived2 : public Base {
public:
virtual void whoami() {
cout << "== Derived2 ==" << endl;
}
};
int main(int argc, char *argv[]) {
int t = 0;
Base * var;
if (t == 1) {
Derived1 v;
var = &v;
var->whoami();
} else if (t == 0) {
Derived2 v;
var = &v;
var->whoami();
}
var->whoami();
return 0;
}
----------------------------------------------------------------------
This code, as shown, compiles, runs and produces the expected
result. However, if I uncomment the 'string temp2;' line, the code
runs to produce the following error message:
==============
== Derived2 ==
pure virtual method called
terminate called without an active exception
Abort
==============
Could someone please explain this behavior and clue me in on how to
correct it? Thanks a lot.
Look at this section of code:
} else if (t == 0) {
Derived2 v;
var = &v;
var->whoami();
}
var->whoami();
Derived2 v has a lifetime of the else block. After the block v goes
out of scope. Your 2nd call to var->whoami() is attempting to
derefernce a pointer to an instance that has gone out of scope.
This is underfined behavior. Undefined behavior means anything can
happen, such as showing some output when there is no variable
defined ni the class or crashing when there is or whatever, it is
undefined.
How to correct it? Do not have your Base* point to a local instance
of a class then attempt to use it after the variable goes out of
scope. This may include using new or simply not attempting to
access the variable after what it points to goes out of scope, it
depends on your program.
main() could be reduced farther to show this happening.
int main(int argc, char *argv[]) {
Base * var;
{
Derived2 v;
var = &v;
var->whoami();
}
var->whoami();
return 0;
}
It is only the block itself that causes the issue, doesn't matter if
it's a for block, if block, switch block or naked block as shown.
Any variable defined inside of a block has local scope to that block.
--
Jim Langston
tazmas...@rocketmail.com