Here's an instantition: Base * ptr = new Derived() ;
After working with ptr
, I want to reset it.
Why derived class members are not reset when doing *ptr = Derived() ;
while base class members are ?
See for yourself in a complete example:
#include <iostream>
#include <vector>
void print_array(const std::vector<int> & vec, const std::string & name = "" )
{
std::cout << name << " => [ " ;
for (unsigned i = 0; i < vec.size(); ++i)
{
std::cout << vec[i] << " " ;
}
std::cout << "]" << std::endl ;
}
void do_stuff(std::vector<int> & vec, unsigned size)
{
vec.resize(size) ;
std::fill(vec.begin(), vec.end(), size) ;
}
class Base
{
public:
std::vector<int> base ;
Base() {}
virtual ~Base() {}
};
class Derived : public Base
{
public:
std::vector<int> derv ;
Derived() {}
virtual ~Derived() {}
};
int main()
{
// Working but without polymorphism
// Derived * ptr = new Derived() ;
//Non-working
Base * ptr = new Derived() ;
std::vector<int> & vecbase = static_cast<Derived*>(ptr)->base ;
std::vector<int> & vecderv = static_cast<Derived*>(ptr)->derv ;
print_array(vecbase, "vecbase") ;
print_array(vecderv, "vecderv") ;
do_stuff(vecbase, 3) ;
do_stuff(vecderv, 3) ;
print_array(vecbase, "vecbase") ;
print_array(vecderv, "vecderv") ;
// Non-working
*ptr = Derived() ;
// Working but non-optimal
// delete ptr ;
// ptr = new Derived() ;
print_array(vecbase, "vecbase") ;
print_array(vecderv, "vecderv") ;
do_stuff(vecbase, 5) ;
do_stuff(vecderv, 5) ;
print_array(vecbase, "vecbase") ;
print_array(vecderv, "vecderv") ;
return 0;
}
Current output:
vecbase => [ ]
vecderv => [ ]
vecbase => [ 3 3 3 ]
vecderv => [ 3 3 3 ]
vecbase => [ ]
vecderv => [ 3 3 3 ] <=
vecbase => [ 5 5 5 5 5 ]
vecderv => [ 5 5 5 5 5 ]
Expected output:
vecbase => [ ]
vecderv => [ ]
vecbase => [ 3 3 3 ]
vecderv => [ 3 3 3 ]
vecbase => [ ]
vecderv => [ ] <=
vecbase => [ 5 5 5 5 5 ]
vecderv => [ 5 5 5 5 5 ]
[Edit by Peter:] Note that this is not slicing because *p
is a Derived
, even if its static type is Base
.]