diff --git a/CPlusPlus/intro/ClassA.cpp b/CPlusPlus/intro/ClassA.cpp index 72f3932..05e2bc4 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,14 @@ ClassA::ClassA(const ClassA& other) ClassA::~ClassA() { + std::cout << "~ClassA called" << std::endl; if (_pNumber != nullptr) { delete _pNumber; _pNumber = nullptr; } } + +void ClassA::Print() +{ +} diff --git a/CPlusPlus/intro/ClassA.h b/CPlusPlus/intro/ClassA.h index ca6753a..c7fd632 100644 --- a/CPlusPlus/intro/ClassA.h +++ b/CPlusPlus/intro/ClassA.h @@ -1,6 +1,7 @@ #pragma once +#include "IPrintable.h" -class ClassA +class ClassA : public IPrintable { // private @@ -10,6 +11,9 @@ public: ClassA(const ClassA& other); // copy constructor ~ClassA(); // destructor + const int& GetNumber() const { return *_pNumber; } // implicit inline method + void Print() override; + protected: // protected diff --git a/CPlusPlus/intro/ClassB.cpp b/CPlusPlus/intro/ClassB.cpp new file mode 100644 index 0000000..518d571 --- /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/IPrintable.h b/CPlusPlus/intro/IPrintable.h new file mode 100644 index 0000000..ce78377 --- /dev/null +++ b/CPlusPlus/intro/IPrintable.h @@ -0,0 +1,10 @@ +#pragma once +#include + +class IPrintable +{ +public: + IPrintable() { std::cout << "IPrintable called" << std::endl; } + virtual ~IPrintable() { std::cout << "~IPrintable called" << std::endl; } + virtual void Print() = 0; // pure virtual +}; \ No newline at end of file diff --git a/CPlusPlus/intro/functions.h b/CPlusPlus/intro/functions.h index 4751ff8..2fc66ae 100644 --- a/CPlusPlus/intro/functions.h +++ b/CPlusPlus/intro/functions.h @@ -10,4 +10,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__ diff --git a/CPlusPlus/intro/intro.vcxproj b/CPlusPlus/intro/intro.vcxproj index 1a0f083..4a50f2c 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..d3bb0c5 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 ae854a8..109770c 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" using namespace std; @@ -107,8 +108,37 @@ int main() //} //cout << "sn2 refs: " << sn2.use_count() << endl; - ClassA classA; - ClassA classA2 = classA; + //ClassA classA; + //ClassA classA2 = classA; + //ClassB classB; + //int n = classA.GetNumber(); + //cout << n << endl; + //classB.GetNumber(); + + IPrintable* pPrintable = nullptr; + pPrintable = new ClassB(); + //(*pPrintable).Print(); + //pPrintable->Print(); // same line as above, but simpler + ////ClassB* pClassB2 = (ClassB*)pPrintable; // C-Cast, CAUTION: DANGER!!! + //ClassB* pClassB2 = dynamic_cast(pPrintable); // c++ cast for polymorhpic cast + //float f = 1.0f; + //int i = static_cast(f); // c++ cast, convert one static data type into another + ////int* nonsense = reinterpret_cast(pPrintable); // c++ cast like C-Cast, CAUTION: DANGER!!! + //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* cicp; + //const int* const cipc; + //int const* const icpc; + //const int const* const cicpc; + + //delete pPrintable; + //pPrintable = nullptr; + safeDelete(pPrintable); return 0; }