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)) 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;
}
+6 -2
View File
@@ -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
+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 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__
+3
View File
@@ -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">
+9
View File
@@ -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>
+37 -2
View File
@@ -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;
} }