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
 | 
					classes
 | 
				
			||||||
lvalues
 | 
					lvalues
 | 
				
			||||||
bad_alloc
 | 
					bad_alloc
 | 
				
			||||||
 | 
					rtti
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,3 +17,4 @@ add_executable(casts casts.cpp)
 | 
				
			||||||
add_executable(classes classes.cpp)
 | 
					add_executable(classes classes.cpp)
 | 
				
			||||||
add_executable(lvalues lvalues.cpp)
 | 
					add_executable(lvalues lvalues.cpp)
 | 
				
			||||||
add_executable(bad_alloc bad_alloc.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