Don't use
C
-like casts in
C++
code.
C++
features
dynamic_cast
. Try
#include <iostream>
using namespace std;
class Base
{
public:
virtual void funcBase() = 0;
virtual ~Base(){}
};
class DeriveOne : public Base
{
public:
const char* funcDeriveOne(){ return "hi";}
void funcBase() final override
{
}
virtual ~DeriveOne(){}
};
class DeriveTwo : public Base
{
public:
bool funcDeriveTwo() { return true;}
void funcBase() final override
{
}
virtual ~DeriveTwo(){}
};
void func( Base & base)
{
try
{
cout << dynamic_cast<DeriveOne & >(base).funcDeriveOne() << endl;
}
catch (exception & e)
{
cout << e.what() << " (DeriveOne)" << endl;
}
try
{
cout << dynamic_cast<DeriveTwo & >(base).funcDeriveTwo() << endl;
}
catch(exception & e)
{
cout << e.what() << " (DeriveTwo)" << endl;
}
}
int main()
{
Base * pdo = new DeriveOne();
Base * pdt = new DeriveTwo();
func(*pdo);
cout << "--------" << endl;
func(*pdt);
delete pdt;
delete pdo;
}
Quote:
is there another way to cast it down in a traditional or legacy sort of way?
Of course, you can:
void func_c_cast( Base & base )
{
cout << (*(DeriveOne *)&base).funcDeriveOne() << endl;
cout << (*(DeriveTwo *)&base).funcDeriveTwo() << endl;
}
However, you are looking for 'unexpected behaviour'.