add a small rtti experiment
This commit is contained in:
parent
cef5d842b3
commit
415a618522
3 changed files with 81 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -17,3 +17,4 @@ casts
|
|||
classes
|
||||
lvalues
|
||||
bad_alloc
|
||||
rtti
|
||||
|
|
|
@ -17,3 +17,4 @@ add_executable(casts casts.cpp)
|
|||
add_executable(classes classes.cpp)
|
||||
add_executable(lvalues lvalues.cpp)
|
||||
add_executable(bad_alloc bad_alloc.cpp)
|
||||
add_executable(rtti rtti.cpp)
|
||||
|
|
79
rtti.cpp
Normal file
79
rtti.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <typeinfo>
|
||||
|
||||
|
||||
class Nail {
|
||||
public:
|
||||
Nail(float length)
|
||||
: length(length) {};
|
||||
|
||||
float getLength() {
|
||||
return length;
|
||||
}
|
||||
|
||||
private:
|
||||
float length;
|
||||
};
|
||||
|
||||
|
||||
class Tool {
|
||||
public:
|
||||
virtual void use() {
|
||||
std::cout << "Just using some tool." << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class Hammer : public Tool {
|
||||
public:
|
||||
virtual void use() {
|
||||
std::cout << "Hammer time!" << std::endl;
|
||||
}
|
||||
|
||||
void use(Nail nail) {
|
||||
std::cout << "The nail is " << nail.getLength() << " cm long" << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class SledgeHammer : public Hammer {
|
||||
public:
|
||||
void use(Nail nail __attribute__((unused))) {
|
||||
throw std::runtime_error("Can't use a sledge hammer on nails!");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void useSomeTool(Tool &tool) {
|
||||
// RTTI gives up the type of the derived class.
|
||||
std::cout << "Look, it's a " << typeid(tool).name() << "!" << std::endl;
|
||||
|
||||
// XXX What about subclasses of Hammer?
|
||||
if(typeid(tool) == typeid(Hammer)) {
|
||||
std::cout << "Stop! ";
|
||||
}
|
||||
tool.use();
|
||||
|
||||
// Or dynamic_cast it and use it on a nail
|
||||
// XXX How to use a reference here?
|
||||
Hammer* h = dynamic_cast<Hammer*>(&tool);
|
||||
if (h) {
|
||||
Nail nail(10);
|
||||
h->use(nail);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
Tool tool;
|
||||
Hammer hammer;
|
||||
SledgeHammer sledgehammer;
|
||||
|
||||
useSomeTool(tool);
|
||||
useSomeTool(hammer);
|
||||
useSomeTool(sledgehammer);
|
||||
}
|
||||
|
||||
// XXX http://en.cppreference.com/w/cpp/language/typeid
|
||||
// XXX https://en.wikipedia.org/wiki/Dynamic_cast
|
Loading…
Add table
Add a link
Reference in a new issue