add pure virtual

add interfaces like classes
add template example
This commit is contained in:
2025-02-12 13:03:15 +01:00
parent 4c7ee6f3a6
commit dc3cfc8fa3
9 changed files with 104 additions and 4 deletions
+7
View File
@@ -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;
}
+6 -2
View File
@@ -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
+12
View File
@@ -0,0 +1,12 @@
#include "ClassB.h"
ClassB::ClassB()
{
std::cout << "ClassB() called" << std::endl;
GetNumber();
}
ClassB::~ClassB()
{
std::cout << "~ClassB() called" << std::endl;
}
+10
View File
@@ -0,0 +1,10 @@
#pragma once
#include "ClassA.h"
class ClassB : public ClassA
{
public:
ClassB();
~ClassB();
};
+10
View File
@@ -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;
};
+10
View File
@@ -9,4 +9,14 @@ void changeInt(int n);
void changeIntPointer(int* pN);
void changeIntReference(int& n);
template<class T>
void safeDelete(T*& pObj)
{
if (pObj != nullptr)
{
delete pObj;
pObj = nullptr;
}
}
#endif // __FUNCTIONS_H__
+3
View File
@@ -128,12 +128,15 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="ClassA.cpp" />
<ClCompile Include="ClassB.cpp" />
<ClCompile Include="functions.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="ClassA.h" />
<ClInclude Include="ClassB.h" />
<ClInclude Include="functions.h" />
<ClInclude Include="IComparable.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
+9
View File
@@ -24,6 +24,9 @@
<ClCompile Include="ClassA.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ClassB.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="functions.h">
@@ -32,5 +35,11 @@
<ClInclude Include="ClassA.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ClassB.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="IComparable.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
+37 -2
View File
@@ -3,6 +3,7 @@
#include <memory>
#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<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;
}