diff --git a/CPlusPlus/intro/ClassA.cpp b/CPlusPlus/intro/ClassA.cpp index 72f3932..d2399d7 100644 --- a/CPlusPlus/intro/ClassA.cpp +++ b/CPlusPlus/intro/ClassA.cpp @@ -2,6 +2,7 @@ ClassA::ClassA() : _pNumber(new int(0)) { + std::cout << "ClassA() called" << std::endl; } ClassA::ClassA(const ClassA& other) @@ -15,9 +16,15 @@ ClassA::ClassA(const ClassA& other) ClassA::~ClassA() { + std::cout << "~ClassA() called" << std::endl; if (_pNumber != nullptr) { delete _pNumber; _pNumber = nullptr; } } + +bool ClassA::Compare(IComparable* pOther) +{ + return false; +} diff --git a/CPlusPlus/intro/ClassA.h b/CPlusPlus/intro/ClassA.h index ca6753a..197e294 100644 --- a/CPlusPlus/intro/ClassA.h +++ b/CPlusPlus/intro/ClassA.h @@ -1,6 +1,7 @@ #pragma once +#include "IComparable.h" -class ClassA +class ClassA : public IComparable { // private @@ -8,7 +9,10 @@ public: // public ClassA(); // default constructor ClassA(const ClassA& other); // copy constructor - ~ClassA(); // destructor + virtual ~ClassA(); // destructor + + const int& GetNumber() const { return *_pNumber; } // implicit inline method + bool Compare(IComparable* pOther) override; protected: // protected diff --git a/CPlusPlus/intro/ClassB.cpp b/CPlusPlus/intro/ClassB.cpp new file mode 100644 index 0000000..f2284e2 --- /dev/null +++ b/CPlusPlus/intro/ClassB.cpp @@ -0,0 +1,12 @@ +#include "ClassB.h" + +ClassB::ClassB() +{ + std::cout << "ClassB() called" << std::endl; + GetNumber(); +} + +ClassB::~ClassB() +{ + std::cout << "~ClassB() called" << std::endl; +} diff --git a/CPlusPlus/intro/ClassB.h b/CPlusPlus/intro/ClassB.h new file mode 100644 index 0000000..23cfcb2 --- /dev/null +++ b/CPlusPlus/intro/ClassB.h @@ -0,0 +1,10 @@ +#pragma once +#include "ClassA.h" + +class ClassB : public ClassA +{ +public: + ClassB(); + ~ClassB(); +}; + diff --git a/CPlusPlus/intro/IComparable.h b/CPlusPlus/intro/IComparable.h new file mode 100644 index 0000000..7da45a3 --- /dev/null +++ b/CPlusPlus/intro/IComparable.h @@ -0,0 +1,10 @@ +#pragma once +#include + +class IComparable +{ +public: + IComparable() { std::cout << "IComparable() called" << std::endl; } + virtual ~IComparable() { std::cout << "~IComparable() called" << std::endl; } + virtual bool Compare(IComparable* pOther) = 0; +}; \ No newline at end of file diff --git a/CPlusPlus/intro/functions.h b/CPlusPlus/intro/functions.h index a4cd8bc..a33d058 100644 --- a/CPlusPlus/intro/functions.h +++ b/CPlusPlus/intro/functions.h @@ -9,4 +9,14 @@ void changeInt(int n); void changeIntPointer(int* pN); void changeIntReference(int& n); +template +void safeDelete(T*& pObj) +{ + if (pObj != nullptr) + { + delete pObj; + pObj = nullptr; + } +} + #endif // __FUNCTIONS_H__ \ No newline at end of file diff --git a/CPlusPlus/intro/intro.vcxproj b/CPlusPlus/intro/intro.vcxproj index c947c5b..a7e4f42 100644 --- a/CPlusPlus/intro/intro.vcxproj +++ b/CPlusPlus/intro/intro.vcxproj @@ -128,12 +128,15 @@ + + + diff --git a/CPlusPlus/intro/intro.vcxproj.filters b/CPlusPlus/intro/intro.vcxproj.filters index c69c230..6a7ca7f 100644 --- a/CPlusPlus/intro/intro.vcxproj.filters +++ b/CPlusPlus/intro/intro.vcxproj.filters @@ -24,6 +24,9 @@ Source Files + + Source Files + @@ -32,5 +35,11 @@ Header Files + + Header Files + + + Header Files + \ No newline at end of file diff --git a/CPlusPlus/intro/main.cpp b/CPlusPlus/intro/main.cpp index db57c7d..8b67da4 100644 --- a/CPlusPlus/intro/main.cpp +++ b/CPlusPlus/intro/main.cpp @@ -3,6 +3,7 @@ #include #include "functions.h" #include "ClassA.h" +#include "ClassB.h" int number = 0; @@ -115,8 +116,42 @@ int main() //cout << "sn2 refs: " << sn2.use_count() << endl; - ClassA classA; - ClassA classA2 = classA; + //ClassA classA; + //ClassA classA2 = classA; + //ClassB classB; + + //int number = classA.GetNumber(); + //cout << number << endl; + //classB.GetNumber(); + + //IComparable* pComparable = nullptr; + //pComparable = new ClassB(); + ////ClassB* pClassB2 = (ClassB*)pComparable; // C-Cast, CAUTION: DANGER!!! + //ClassB* pClassB2 = dynamic_cast(pComparable); // C++ polymorph cast + //float f = 1.0f; + //int i = static_cast(f); // explicit c++ cast between two static data types + ////int* pNonsense = reinterpret_cast(pComparable); // c++ cast like C-Cast + //const char csz[13] = "Hello World"; + //char* sz = const_cast(csz); + + // What's the difference? + //const int* cip; + //int const* icp; + //int* const ipc; + //const int* const cipc; + //int const* const icpc; + //const int const* const cicpc; + + IComparable* pComparable = nullptr; + IComparable* pComparable2 = new ClassA(); + pComparable = new ClassB(); + (*pComparable).Compare(pComparable2); + pComparable->Compare(pComparable2); // identical to line above, but simpler + delete pComparable; + pComparable = nullptr; + //delete pComparable2; + //pComparable2 = nullptr; + safeDelete(pComparable2); return 0; }