D
Dom Jackson
I have a program which crashes when:
1 - I use static_cast to turn a base type pointer into a pointer to a
derived type
2 - I use this new pointer to call a function in an object of the
derived type
3 - this function then 'grows' the derived type object (by pushing
onto a vector).
Is this actually possible, or should I be doing something else? In
more detail, what I'm doing is (there's a complete test program below,
which crashes):
1 - I have a base class which doesn't do very much;
2 - I declare a derived class with public inheritance from the base
class;
3 - the derived class has a method which pushes onto a vector in the
derived class;
4 - I create an STL set of base class objects;
5 - I then insert an object of the derived class into this set. I use
the set 'insert' method, which returns an iterator to the new object
in the set, but this is an iterator to a *base* object (I hope)
6 - I convert the iterator to a pointer, and static_cast the pointer
to a pointer to an object of the derived class
7 - I call my new method via this pointer, pushing onto the vector in
the derived-class-object. Bang.
Any help much appreciated.
Thanks -
Dom
===========================================
#include <vector>
#include <set>
#include <iostream>
using std::vector;
using std::set;
using std::cout;
class A {
public:
A(int v) :
val(v) {}
int val;
};
class D : public A {
public:
D(int v) :
A(v) {}
mutable vector<int> vec;
void dfunc(void) const {
std::cout << "hello world " << val << "!\n";
// ********************************************
// Ok without this line, crashes with this line
vec.push_back(val);
// ********************************************
}
};
class ALess {
public :
bool operator() (const A& a1, const A& a2) const {
return a1.val < a2.val;
}
};
typedef set<A, ALess> ASet;
typedef ASet::iterator ASetIter;
typedef std:air<ASetIter, bool> ASetInsRetVal;
int main() {
ASetInsRetVal retval;
ASet aset;
for(int i=0; i<4; i++) {
retval = aset.insert(D(i));
if(!retval.second)
cout << "insert failed\n";
else {
const D *dptr = static_cast<const D*>(&(*retval.first));
dptr->dfunc(); // crashes - see above
}
}
}
==============================================
1 - I use static_cast to turn a base type pointer into a pointer to a
derived type
2 - I use this new pointer to call a function in an object of the
derived type
3 - this function then 'grows' the derived type object (by pushing
onto a vector).
Is this actually possible, or should I be doing something else? In
more detail, what I'm doing is (there's a complete test program below,
which crashes):
1 - I have a base class which doesn't do very much;
2 - I declare a derived class with public inheritance from the base
class;
3 - the derived class has a method which pushes onto a vector in the
derived class;
4 - I create an STL set of base class objects;
5 - I then insert an object of the derived class into this set. I use
the set 'insert' method, which returns an iterator to the new object
in the set, but this is an iterator to a *base* object (I hope)
6 - I convert the iterator to a pointer, and static_cast the pointer
to a pointer to an object of the derived class
7 - I call my new method via this pointer, pushing onto the vector in
the derived-class-object. Bang.
Any help much appreciated.
Thanks -
Dom
===========================================
#include <vector>
#include <set>
#include <iostream>
using std::vector;
using std::set;
using std::cout;
class A {
public:
A(int v) :
val(v) {}
int val;
};
class D : public A {
public:
D(int v) :
A(v) {}
mutable vector<int> vec;
void dfunc(void) const {
std::cout << "hello world " << val << "!\n";
// ********************************************
// Ok without this line, crashes with this line
vec.push_back(val);
// ********************************************
}
};
class ALess {
public :
bool operator() (const A& a1, const A& a2) const {
return a1.val < a2.val;
}
};
typedef set<A, ALess> ASet;
typedef ASet::iterator ASetIter;
typedef std:air<ASetIter, bool> ASetInsRetVal;
int main() {
ASetInsRetVal retval;
ASet aset;
for(int i=0; i<4; i++) {
retval = aset.insert(D(i));
if(!retval.second)
cout << "insert failed\n";
else {
const D *dptr = static_cast<const D*>(&(*retval.first));
dptr->dfunc(); // crashes - see above
}
}
}
==============================================