diff --git a/ex02/Makefile b/ex02/Makefile new file mode 100644 index 0000000..50a9b23 --- /dev/null +++ b/ex02/Makefile @@ -0,0 +1,4 @@ +override NAME = ex02.out +override SRC_FILES = main.cpp Base.cpp + +include ../Makefile diff --git a/ex02/src/A.hpp b/ex02/src/A.hpp new file mode 100644 index 0000000..7f0af6f --- /dev/null +++ b/ex02/src/A.hpp @@ -0,0 +1,6 @@ +#pragma once + +#include + +class A : public Base { +}; diff --git a/ex02/src/B.hpp b/ex02/src/B.hpp new file mode 100644 index 0000000..05f0f39 --- /dev/null +++ b/ex02/src/B.hpp @@ -0,0 +1,6 @@ +#pragma once + +#include + +class B : public Base { +}; diff --git a/ex02/src/Base.cpp b/ex02/src/Base.cpp new file mode 100644 index 0000000..c06bb0e --- /dev/null +++ b/ex02/src/Base.cpp @@ -0,0 +1,4 @@ +#include + +Base::~Base() { +} diff --git a/ex02/src/Base.hpp b/ex02/src/Base.hpp new file mode 100644 index 0000000..9c288f3 --- /dev/null +++ b/ex02/src/Base.hpp @@ -0,0 +1,6 @@ +#pragma once + +class Base { + public: + virtual ~Base(); +}; diff --git a/ex02/src/C.hpp b/ex02/src/C.hpp new file mode 100644 index 0000000..511d5ac --- /dev/null +++ b/ex02/src/C.hpp @@ -0,0 +1,6 @@ +#pragma once + +#include + +class C : public Base { +}; diff --git a/ex02/src/main.cpp b/ex02/src/main.cpp new file mode 100644 index 0000000..bc042ac --- /dev/null +++ b/ex02/src/main.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include +#include + +static Base* generate() { + std::cout << "Generating..." << std::endl; + + switch (std::rand() % 3) { + case 0: + std::cout << "A" << std::endl; + return new A(); + case 1: + std::cout << "B" << std::endl; + return new B(); + case 2: + std::cout << "C" << std::endl; + return new C(); + } + + std::cout << "What the sigma?" << std::endl; + return NULL; +} + +static void identify(const Base* base) { + std::cout << "Identifying..." << std::endl; + + if (dynamic_cast(base) != NULL) + std::cout << base << " is A" << std::endl; + else if (dynamic_cast(base) != NULL) + std::cout << base << " is B" << std::endl; + else if (dynamic_cast(base) != NULL) + std::cout << base << " is C" << std::endl; +} + +static void identify(const Base& base) { + std::cout << "Identifying..." << std::endl; + + try { + const A& reference = dynamic_cast(base); + std::cout << &reference << " is A" << std::endl; + return; + } catch (...) {} + + try { + const B& reference = dynamic_cast(base); + std::cout << &reference << " is B" << std::endl; + return; + } catch (...) {} + + try { + const C& reference = dynamic_cast(base); + std::cout << &reference << " is C" << std::endl; + return; + } catch (...) {} +} + +int main() { + std::srand(static_cast(std::time(NULL))); + + const Base* base = generate(); + + if (base == NULL) + return EXIT_FAILURE; + + identify(*base); + identify(base); + + delete base; +}