|
|||||||
Указатели, ссылки и наследование, Виртуальные ф-ции, модификаторы override, final, Ковариантный тип возврата, Виртуальный деструктор, Игнорирование виртуальных ф-ций, Раннее и позднее связывание, Виртуальные таблицы
Время создания: 13.06.2020 20:02
Раздел: C++ - Примеры кода - Работа на уроке
Запись: Shut913/Tetra-notes-Programming/master/base/1592067772bydkyqpngu/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
#include <iostream> // == Указатели, ссылки и наследование //class Parent //{ //protected: // int _value; // //public: // Parent(int value) // : _value(value) {} // // const char* getName() { return "Parent"; } // int getValue() { return _value; } //}; // //class Child : public Parent //{ //public: // Child(int value) // : Parent(value) {} // // const char* getName() { return "Child"; } // int getDoubled() { return _value * 2; } //}; // //int main() //{ // Child child(7); // std::cout << child.getName() << " " << child.getValue() << "\n"; // // Child& rChild = child; // std::cout << rChild.getName() << " " << rChild.getValue() << "\n"; // // Child* pChild = &child; // std::cout << pChild->getName() << " " << pChild->getValue() << "\n"; // // // // Parent& rParent = child; // Parent* pParent = &child; // // std::cout << child.getName() << " " << child.getValue() << "\n"; // std::cout << rParent.getName() << " " << rParent.getValue() << "\n"; // std::cout << pParent->getName() << " " << pParent->getValue() << "\n"; // // return 0; //} // // //class Animal //{ //protected: // std::string _name; // // Animal(std::string name) // : _name(name) {} // //public: // std::string getName() { return _name; } // const char* speak() { return "???"; } //}; // //class Cat : public Animal //{ //public: // Cat(std::string name) // : Animal(name) {} // // const char* speak() { return "Meow"; } //}; // //class Dog : public Animal //{ //public: // Dog(std::string name) // : Animal(name) {} // // const char* speak() { return "Woof"; } //}; //// //// ////void printInfo(Cat& cat) ////{ //// std::cout << cat.getName(); ////} //// ////void printInfo(Dog& dog) ////{ //// std::cout << dog.getName(); ////} //// //void printInfo(Animal& animal) //{ // std::cout << animal.getName() << "\n"; //} // // //int main() //{ // Cat cat("Matroskin"); // std::cout << cat.getName() << " " << cat.speak() << '\n'; // // Dog dog("Barsik"); // std::cout << dog.getName() << " " << dog.speak() << '\n'; // // // Animal* pAnimal = &cat; // std::cout << pAnimal->getName() << " " << pAnimal->speak() << '\n'; // // pAnimal = &dog; // std::cout << pAnimal->getName() << " " << pAnimal->speak() << '\n'; // // std::cout << "\n=======\n\n"; // printInfo(cat); // printInfo(dog); // // return 0; //} // == Виртуальные ф-ции //class Parent //{ //public: // virtual const char* getName() { return "Parent"; } //}; // //class Child : public Parent //{ //public: // virtual const char* getName() { return "Child"; } //}; // //int main() //{ // Child child; // Parent& rParent = child; // // std::cout << rParent.getName() << "\n"; // // return 0; //} // //class A //{ //public: // virtual const char* getName() { return "A"; } //}; // //class B : public A //{ //public: // virtual const char* getName() { return "B"; } //}; // //class C : public B //{ //public: // virtual const char* getName() { return "C"; } //}; // //class D : public C //{ //public: // virtual const char* getName() { return "D"; } //}; // //int main() //{ // C c; // // A& rParent = c; // // std::cout << rParent.getName() << '\n'; // // return 0; //} // // //class Animal //{ //protected: // std::string _name; // // Animal(std::string name) // : _name(name) {} // //public: // std::string getName() { return _name; } // virtual const char* speak() { return "???"; } //}; // //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"; } //}; // //int main() //{ // Cat cat("Matroskin"); // std::cout << cat.getName() << " " << cat.speak() << '\n'; // // Dog dog("Barsik"); // std::cout << dog.getName() << " " << dog.speak() << '\n'; // // // Animal* pAnimal = &cat; // std::cout << pAnimal->getName() << " " << pAnimal->speak() << '\n'; // // pAnimal = &dog; // std::cout << pAnimal->getName() << " " << pAnimal->speak() << '\n'; // // return 0; //} // == модификаторы override, final // -- override //class A //{ //public: // virtual const char* getName1(int x) { return "A"; } // virtual const char* getName2(int x) { return "A"; } // virtual const char* getName3(int x) { return "A"; } //}; // //class B : public A //{ //public: // virtual const char* getName1(short int x) override { return "B"; } // virtual const char* getName2(int x) const override { return "B"; } // virtual const char* getName3(int x) override { return "B"; } //}; // //int main() //{ // B b; // A& rParent = b; // // std::cout << rParent.getName1(2) << "\n"; // std::cout << rParent.getName2(3) << "\n"; //} // -- final //class A final //{ //public: // virtual const char* getName() { return "A"; } //}; // //class B : public A //{ //public: // virtual const char* getName() override final { return "B"; } //}; // //class C : public B //{ //public: // virtual const char* getName() override { return "C"; } //}; // Ковариантный тип возврата //class Parent //{ //public: // virtual Parent* getThis() // { // std::cout << "called Parent::getThis()\n"; // return this; // } // // void printType() { std::cout << "returned a Parent\n"; } //}; // //class Child : public Parent //{ //public: // virtual Child* getThis() override // { // std::cout << "called Child::getThis()\n"; // return this; // } // void printType() { std::cout << "returned a Child\n"; } //}; // //int main() //{ // Child ch; // Parent* p = &ch; // ch.getThis()->printType(); // вызывается Child::getThis(), возвращается Child*, вызывается Child::printType // p->getThis()->printType(); // вызывается Child::getThis(), возвращается Parent*, вызывается Parent::printType //} // -- Виртуальный деструктор //class Parent //{ //public: // virtual ~Parent() // { // std::cout << "Calling ~Parent()" << std::endl; // } //}; // //class Child : public Parent //{ //private: // int* _array; // //public: // Child(int length) // { // _array = new int[length]; // } // // virtual ~Child() override // { // std::cout << "Calling ~Child()" << std::endl; // delete[] _array; // } //}; // //int main() //{ // Child* pChild = new Child(7); // Parent* pParent = pChild; // // delete pParent; // // return 0; //} // -- Игнорирование виртуальных ф-ций //class Parent //{ //public: // virtual const char* getName() { return "Parent"; } //}; // //class Child : public Parent //{ //public: // virtual const char* getName() override { return "Child"; } //}; // //int main() //{ // Child child; // Parent& pParent = child; // // std::cout << pParent.Parent::getName(); //} // == Раннее и позднее связывание // -- Ранее связывание //int add(int a, int b) //{ // return a + b; //} // //int subtract(int a, int b) //{ // return a - b; //} // //int multiply(int a, int b) //{ // return a * b; //} // //int main() //{ // int a; // std::cout << "Enter a number: "; // std::cin >> a; // // int b; // std::cout << "Enter another number: "; // std::cin >> b; // // int operation; // do // { // std::cout << "Enter an operationeration (0 = add, 1 = subtract, 2 = multiply): "; // std::cin >> operation; // } while (operation < 0 || operation > 2); // // int result = 0; // switch (operation) // { // case 0: result = add(a, b); break; // case 1: result = subtract(a, b); break; // case 2: result = multiply(a, b); break; // } // // std::cout << "The answer is: " << result << std::endl; // // return 0; //} // -- Позднее связывание //int add(int a, int b) //{ // return a + b; //} // //int subtract(int a, int b) //{ // return a - b; //} // //int multiply(int a, int b) //{ // return a * b; //} // //int main() //{ // int a; // std::cout << "Enter a number: "; // std::cin >> a; // // int b; // std::cout << "Enter another number: "; // std::cin >> b; // // int operation; // do // { // std::cout << "Enter an operationeration (0 = add, 1 = subtract, 2 = multiply): "; // std::cin >> operation; // } while (operation < 0 || operation > 2); // // int (*pFunc)(int, int) = nullptr; // // switch (operation) // { // case 0: pFunc = add; break; // case 1: pFunc = subtract; break; // case 2: pFunc = multiply; break; // } // // std::cout << "The answer is: " << pFunc(a, b) << std::endl; // // return 0; //} // == Виртуальные таблицы //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() {}; //}; |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|