using dynamic_cast with template classes.
-
// Demonstrate dynamic_cast on template classes.
#include using namespace std;template class Num {
protected:
T val;
public:
Num(T x) { val = x;}
virtual T getval() { return val; }
};template class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (val * val); }
};int main(){
Num *bp, numInt_ob(2);
SqrNum *dp, sqrInt_ob(3);
Num numDouble_ob(3.3);bp = dynamic\_cast\*> (&sqrInt\_ob); //sqrInt\_ob is from a derived class of Num. if(bp) { cout << "Cast from sqrNum\* to Num\* OK.\\n" << "Value is " << bp->getval() << endl; } else cout << "Error !\\n\\n"; dp = dynamic\_cast\> (&numInt\_ob); //numInt\_ob is base class object and SqrNum is a derived class. if(dp) cout << "Error !\\n"; else { cout << "Cast from Num\* to SqrNum\* not OK.\\n" << "Can't cast a pointer to a base object into\\n" << "a pointer to a derived object\\n\\n"; } bp = dynamic\_cast\*> (&numDouble\_ob); //Num of type int & numDouble\_ob is of type Num if(bp) cout << "Error" << endl; else { cout << "Can't cast from Num\* to Num\*.\\n" << "These are 2 different types.\\n\\n"; } return 0;
}
in the code above i m getting error that
Quote:
error: 'val' was not declared in this scope T getval() { return (val val); } ^~~
but
Quote:
class SqrNum : public Num
according to this the protected value in the base class should just work fine as protected value in the derived class, but it isn't ? How do i solve this problem ? EDIT : below is the working code:
// Demonstrate dynamic_cast on template classes.
#include
using namespace std;template
class Num {
protected:
T val;
public:
Num(T x) { val = x;}
virtual T getval() { return val; }
};template
class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (Num::val * Num::val); }
};int main(){
Num *bp, numInt_ob(2);
SqrNum *dp, sqrInt_ob(3);
Num numDouble_ob(3.3);bp = dynamic\_cast\*> (
-
// Demonstrate dynamic_cast on template classes.
#include using namespace std;template class Num {
protected:
T val;
public:
Num(T x) { val = x;}
virtual T getval() { return val; }
};template class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (val * val); }
};int main(){
Num *bp, numInt_ob(2);
SqrNum *dp, sqrInt_ob(3);
Num numDouble_ob(3.3);bp = dynamic\_cast\*> (&sqrInt\_ob); //sqrInt\_ob is from a derived class of Num. if(bp) { cout << "Cast from sqrNum\* to Num\* OK.\\n" << "Value is " << bp->getval() << endl; } else cout << "Error !\\n\\n"; dp = dynamic\_cast\> (&numInt\_ob); //numInt\_ob is base class object and SqrNum is a derived class. if(dp) cout << "Error !\\n"; else { cout << "Cast from Num\* to SqrNum\* not OK.\\n" << "Can't cast a pointer to a base object into\\n" << "a pointer to a derived object\\n\\n"; } bp = dynamic\_cast\*> (&numDouble\_ob); //Num of type int & numDouble\_ob is of type Num if(bp) cout << "Error" << endl; else { cout << "Can't cast from Num\* to Num\*.\\n" << "These are 2 different types.\\n\\n"; } return 0;
}
in the code above i m getting error that
Quote:
error: 'val' was not declared in this scope T getval() { return (val val); } ^~~
but
Quote:
class SqrNum : public Num
according to this the protected value in the base class should just work fine as protected value in the derived class, but it isn't ? How do i solve this problem ? EDIT : below is the working code:
// Demonstrate dynamic_cast on template classes.
#include
using namespace std;template
class Num {
protected:
T val;
public:
Num(T x) { val = x;}
virtual T getval() { return val; }
};template
class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (Num::val * Num::val); }
};int main(){
Num *bp, numInt_ob(2);
SqrNum *dp, sqrInt_ob(3);
Num numDouble_ob(3.3);bp = dynamic\_cast\*> (
-
dp = dynamic_cast*> (&numInt_ob); //numInt_ob is base class object and SqrNum is a
Needs an '*' after <int>. Code now runs successfully.
-
// Demonstrate dynamic_cast on template classes.
#include using namespace std;template class Num {
protected:
T val;
public:
Num(T x) { val = x;}
virtual T getval() { return val; }
};template class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (val * val); }
};int main(){
Num *bp, numInt_ob(2);
SqrNum *dp, sqrInt_ob(3);
Num numDouble_ob(3.3);bp = dynamic\_cast\*> (&sqrInt\_ob); //sqrInt\_ob is from a derived class of Num. if(bp) { cout << "Cast from sqrNum\* to Num\* OK.\\n" << "Value is " << bp->getval() << endl; } else cout << "Error !\\n\\n"; dp = dynamic\_cast\> (&numInt\_ob); //numInt\_ob is base class object and SqrNum is a derived class. if(dp) cout << "Error !\\n"; else { cout << "Cast from Num\* to SqrNum\* not OK.\\n" << "Can't cast a pointer to a base object into\\n" << "a pointer to a derived object\\n\\n"; } bp = dynamic\_cast\*> (&numDouble\_ob); //Num of type int & numDouble\_ob is of type Num if(bp) cout << "Error" << endl; else { cout << "Can't cast from Num\* to Num\*.\\n" << "These are 2 different types.\\n\\n"; } return 0;
}
in the code above i m getting error that
Quote:
error: 'val' was not declared in this scope T getval() { return (val val); } ^~~
but
Quote:
class SqrNum : public Num
according to this the protected value in the base class should just work fine as protected value in the derived class, but it isn't ? How do i solve this problem ? EDIT : below is the working code:
// Demonstrate dynamic_cast on template classes.
#include
using namespace std;template
class Num {
protected:
T val;
public:
Num(T x) { val = x;}
virtual T getval() { return val; }
};template
class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (Num::val * Num::val); }
};int main(){
Num *bp, numInt_ob(2);
SqrNum *dp, sqrInt_ob(3);
Num numDouble_ob(3.3);bp = dynamic\_cast\*> (
-
Quote:
template class SqrNum : public Num { public: SqrNum(T x) : Num(x) {} T getval() { return (val * val); } };
Should be
template class SqrNum : public Num {
public:
SqrNum(T x) : Num(x) {}
T getval() { return (Num::val * Num::val); }
}; -
Quote:
return (Num::val * Num::val);
but i have already inherited all the members of the base class to the derived class, then why i need to use scope resolution operator to point where to look for val ?
-