|
|||||||
виртуальные таблицы (vtable), Абстактные ф-ции и классы, Интерфейс (класс-интерфейс, интерфейсный класс), Виртуальный базовый класс, Чисто виртуальный деструктор
Время создания: 13.06.2020 20:07
Раздел: C++ - Примеры кода - Работа на уроке
Запись: Shut913/Tetra-notes-Programming/master/base/1592068032bo34mhebrd/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
#include <iostream> // == виртуальные таблицы (vtable) // *__vptr //class Parent //{ //public: // virtual void function1() {}; // virtual void function2() {}; //}; // //class C1 : public Parent //{ //public: // virtual void function1() {}; //}; // //class C2 : public Parent //{ //public: // virtual void function2() {}; //}; // //int main() //{ // //} // Абстактные ф-ции и классы // -- Чистые виртуальные ф-ции (абстрактные ф-ции) // //class Parent // это уже абстрактный класс //{ //public: // const char* say() { return "Hey"; } // virtual const char* getName() { return "Parent"; } // // virtual int getValue() = 0; //}; // // //class Animal //{ //protected: // std::string _name; //public: // Animal(std::string name) // : _name(name) {} // // std::string getName() { return _name; } // virtual const char* speak() = 0; //}; // //// реализация по-умолчанию //const char* Animal::speak() //{ // return "Default speak"; //} // //class Cat : public Animal //{ //public: // Cat(std::string name) // : Animal(name) {} // // virtual const char* speak() { return "Meow"; } //}; // //class Dog : public Animal //{ //public: // Dog(std::string name) // : Animal(name) {} // // virtual const char* speak() { return "Woof"; } //}; // //class Lion: public Animal //{ //public: // Lion(std::string name) : // Animal(name) {} // // virtual const char* speak() { // //return "RRRR"; // return Animal::speak(); // } //}; // //int main() //{ // Lion lion("Tom"); // Animal& pAnimal= lion; // // std::cout << pAnimal.speak(); //} // Интерфейс (класс-интерфейс, интерфейсный класс) // 1. не имеет переменных-членов // 2. все методы - чистые виртуальные ф-ции //class IErrorLogger //{ //public: // virtual bool openLog(const char* logName) = 0; // virtual bool closeLog() = 0; // virtual bool writeLog(const char* message) = 0; // // virtual ~IErrorLogger() {} //}; // //class FileErrorLogger: public IErrorLogger //{ // virtual bool openLog(const char* logName) override // { // std::cout << "file opened"; // } // // virtual bool closeLog() override {} // virtual bool writeLog(const char* message) override {} //}; // //class DBErrorLogger : public IErrorLogger //{ // virtual bool openLog(const char* logName) override // { // std::cout << "DB opened"; // } // // virtual bool closeLog() override {} // virtual bool writeLog(const char* message) override {} //}; // // //double MySqrt(double value, IErrorLogger& log) //{ // if (value < 0) // { // log.openLog("lkjsdlf"); // log.writeLog("message"); // log.closeLog(); // return 0; // } // // return sqrt(value); //} // //int main() //{ // DBErrorLogger log; // // MySqrt(25, log); //} // Виртуальный базовый класс (решение проблемы алмаза смерти) //class PoweredDevice //{ //public: // PoweredDevice(int power = 0) // { // std::cout << "PoweredDevice: " << power << '\n'; // } //}; // //class Scanner : virtual public PoweredDevice //{ //public: // Scanner(int scanner) // { // std::cout << "Scanner: " << scanner << '\n'; // } //}; // //class Printer : virtual public PoweredDevice //{ //public: // Printer(int printer) // { // std::cout << "Printer: " << printer << '\n'; // } //}; // //class Copier : public Scanner, public Printer //{ //public: // Copier(int scanner, int printer, int power): // PoweredDevice(power), // Scanner(scanner), // Printer(printer) // { // std::cout << "Copier: " << '\n'; // } //}; // //int main() //{ // Copier c(1, 2, 3); //} // Чисто виртуальный деструктор //class A //{ // virtual ~A() = 0; //}; // //A::~A() //{ // std::cout << "abstract"; //} // //class B : public A //{ // //}; |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|