-
casting error
Hi,
i got a base class,and 2 derieved classes.derieved1 and derieved 2.
In the main class,i create a derieved1 and derieve2 object. add it to vector vector<base*> list .
Then i try casting out the first vector item to see if dereived 1 or derieved2. the tests to check if derieved 1 or 2 work for both.
The classes:
Code:
class base{
protected:
base(int val){
value=val;
}
public:
int value;
};
class derieved1:public base {
private:
string data;
public:
derieved1(int val,string x):base(val),data(x){ }
void print(){
cout<<"\ndereieved 1";
}
};
class derieved2:public base {
private:
string data;
public:
derieved2(int val,string x):base(val),data(x){
}
void print(){
cout<<"\ndereieved 2";
}
};
the main function:
Code:
int main(int argc, char *argv[])
{
vector<base*> list;
derieved1* a=new derieved1(1,"derieved1");
derieved2* b=new derieved2(2,"derieved2");
list.push_back(a);
list.push_back(b);
base* bbbb=list[0];
//cast it to both derieved objects.
derieved1*sb=static_cast<derieved1*>(bbbb);
derieved2*sb1=static_cast<derieved2*>(bbbb);
//check which one is valid.
if(sb){
cout<<"object of type derieved1"<<endl;
}
if(sb1){
cout<<"object of type derieved2"<<endl; //should not display
}
system("PAUSE");
return EXIT_SUCCESS;
}
The program prints outs :
object of type derieved1
object of type derieved2
-
1. Don't use system(). Very bad habit. Use getchar() or something...
2. If I remember, sb1 points to SOMETHING so it returns true. Also not something you should do everyday. You may check and see if the information it points to is valid. I think....
3. Don't forget to dereference the pointers using the delete operator.
-
You should be using dynamic_cast, not static_cast.
dynamic_cast will return NULL for a bad pointer cast or throw an exception for a bad reference cast.
-
i convereted it to:
derieved1*sb=dynamic_cast<derieved1*>(bbbb);
derieved2*sb1=dynamic_cast<derieved2*>(bbbb);
It gives me a error.
'dynamic_cast' : 'base' is not a polymorphic type
what should i modify in the base and derieved classes so that it becomes polymorphic?
-
The base class should have at least one virtual function. The destructor should be virtual.