// TemplateSpecializationInheritance.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include using namespace std; /*THIS IS THE OLD STRUCTURE*/ class Device { public: virtual void Print() = 0; }; class InputDevice: public Device { public: void Print() override { cout << "InputDevicePrint" << endl; } virtual void InputPrint() = 0; }; class InputOutputDevice: public Device { public: void Print() override { cout << "InputOutputDevicePrint" << endl; } virtual void InputPrint() = 0; virtual void OutputPrint() = 0; }; class OldInput:public InputDevice { public: void InputPrint() override { cout << "OldInputPrint" << endl; } }; class OldInputOutput:public InputOutputDevice { public: void InputPrint() override { cout << "OldInputPrint" << endl; } void OutputPrint() override { cout << "OldOutputPrint" << endl; } }; /*THE NEW ENVELOPE*/ template class NewInputDevice:public T { public: void Print() override { cout << "newPrint" << endl; } void InputPrint() override { cout << "NewInputPrint" << endl; } }; class NewInputOutputPrint:public NewInputDevice { public: void OutputPrint() override { cout << "NewOutputPrint" << endl; } }; int main() { OldInput oInput; oInput.Print(); //Shows InputDevicePrint oInput.InputPrint(); //Shows OldInputPrint OldInputOutput oInputOutput; oInputOutput.Print(); //Shows InputDevicePrint oInputOutput.InputPrint(); //Shows OldInputPrint oInputOutput.OutputPrint(); //Shows OldOutputPrint NewInputDevice nInput; nInput.Print(); //Shows NewPrint nInput.InputPrint(); //Shows NewInputPrint NewInputOutputPrint nInputOutpur; nInputOutpur.Print(); //Shows NewPrint nInputOutpur.InputPrint(); //Shows NewInputPrint nInputOutpur.OutputPrint(); //NewOutputPrint return 0; }