add pure virtual
add interfaces like classes add template example
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
ClassA::ClassA() : _pNumber(new int(0))
|
ClassA::ClassA() : _pNumber(new int(0))
|
||||||
{
|
{
|
||||||
|
std::cout << "ClassA() called" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassA::ClassA(const ClassA& other)
|
ClassA::ClassA(const ClassA& other)
|
||||||
@@ -15,9 +16,15 @@ ClassA::ClassA(const ClassA& other)
|
|||||||
|
|
||||||
ClassA::~ClassA()
|
ClassA::~ClassA()
|
||||||
{
|
{
|
||||||
|
std::cout << "~ClassA() called" << std::endl;
|
||||||
if (_pNumber != nullptr)
|
if (_pNumber != nullptr)
|
||||||
{
|
{
|
||||||
delete _pNumber;
|
delete _pNumber;
|
||||||
_pNumber = nullptr;
|
_pNumber = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ClassA::Compare(IComparable* pOther)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "IComparable.h"
|
||||||
|
|
||||||
class ClassA
|
class ClassA : public IComparable
|
||||||
{
|
{
|
||||||
// private
|
// private
|
||||||
|
|
||||||
@@ -8,7 +9,10 @@ public:
|
|||||||
// public
|
// public
|
||||||
ClassA(); // default constructor
|
ClassA(); // default constructor
|
||||||
ClassA(const ClassA& other); // copy 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:
|
||||||
// protected
|
// protected
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#include "ClassB.h"
|
||||||
|
|
||||||
|
ClassB::ClassB()
|
||||||
|
{
|
||||||
|
std::cout << "ClassB() called" << std::endl;
|
||||||
|
GetNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassB::~ClassB()
|
||||||
|
{
|
||||||
|
std::cout << "~ClassB() called" << std::endl;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "ClassA.h"
|
||||||
|
|
||||||
|
class ClassB : public ClassA
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ClassB();
|
||||||
|
~ClassB();
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class IComparable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IComparable() { std::cout << "IComparable() called" << std::endl; }
|
||||||
|
virtual ~IComparable() { std::cout << "~IComparable() called" << std::endl; }
|
||||||
|
virtual bool Compare(IComparable* pOther) = 0;
|
||||||
|
};
|
||||||
@@ -9,4 +9,14 @@ void changeInt(int n);
|
|||||||
void changeIntPointer(int* pN);
|
void changeIntPointer(int* pN);
|
||||||
void changeIntReference(int& n);
|
void changeIntReference(int& n);
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void safeDelete(T*& pObj)
|
||||||
|
{
|
||||||
|
if (pObj != nullptr)
|
||||||
|
{
|
||||||
|
delete pObj;
|
||||||
|
pObj = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // __FUNCTIONS_H__
|
#endif // __FUNCTIONS_H__
|
||||||
@@ -128,12 +128,15 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="ClassA.cpp" />
|
<ClCompile Include="ClassA.cpp" />
|
||||||
|
<ClCompile Include="ClassB.cpp" />
|
||||||
<ClCompile Include="functions.cpp" />
|
<ClCompile Include="functions.cpp" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="ClassA.h" />
|
<ClInclude Include="ClassA.h" />
|
||||||
|
<ClInclude Include="ClassB.h" />
|
||||||
<ClInclude Include="functions.h" />
|
<ClInclude Include="functions.h" />
|
||||||
|
<ClInclude Include="IComparable.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
|||||||
@@ -24,6 +24,9 @@
|
|||||||
<ClCompile Include="ClassA.cpp">
|
<ClCompile Include="ClassA.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="ClassB.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="functions.h">
|
<ClInclude Include="functions.h">
|
||||||
@@ -32,5 +35,11 @@
|
|||||||
<ClInclude Include="ClassA.h">
|
<ClInclude Include="ClassA.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="ClassB.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="IComparable.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
#include "ClassA.h"
|
#include "ClassA.h"
|
||||||
|
#include "ClassB.h"
|
||||||
|
|
||||||
int number = 0;
|
int number = 0;
|
||||||
|
|
||||||
@@ -115,8 +116,42 @@ int main()
|
|||||||
|
|
||||||
//cout << "sn2 refs: " << sn2.use_count() << endl;
|
//cout << "sn2 refs: " << sn2.use_count() << endl;
|
||||||
|
|
||||||
ClassA classA;
|
//ClassA classA;
|
||||||
ClassA classA2 = 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<ClassB*>(pComparable); // C++ polymorph cast
|
||||||
|
//float f = 1.0f;
|
||||||
|
//int i = static_cast<int>(f); // explicit c++ cast between two static data types
|
||||||
|
////int* pNonsense = reinterpret_cast<int*>(pComparable); // c++ cast like C-Cast
|
||||||
|
//const char csz[13] = "Hello World";
|
||||||
|
//char* sz = const_cast<char*>(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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user