Latest web development tutorials

C ++ полиморфизм

Полиморфизм буквально означает , что разнообразие форм.Когда связь между классом посредством наследования между классом иерархии, и будет использоваться полиморфизм.

Когда функция-член C ++ вызывает полиморфный среднее, будет выполнять различные функции в зависимости от типа объекта функция вызывается.

В следующем примере, базовый класс Shape является производным для двух категорий, а именно:

#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();

   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

Parent class area
Parent class area

Причиной ошибки выводится, вызовите область функции () устанавливается в качестве компилятора версии базового класса, это называетсястатический полиморфизм, или статическое звено- функция вызывается до реализации программы готова. Иногда его еще называютраннее связывание , так как функция области () во время компиляции программы была создана.

Но теперь, пусть программа немного изменена в классе Shape, первая область () заявление место ключевое слововиртуальный, следующим образом :

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

После внесения изменений, при компиляции и выполняется перед пример кода, он будет производить следующие результаты:

Rectangle class area
Triangle class area

В этом случае компилятор является указателем, чтобы увидеть содержание, а не его тип. Соответственно, поскольку три хранения адреса и объекты класса НОЦ в форме *, и это будет вызывать функцию соответствующую область ().

Как вы можете видеть, каждый класс имеет подфункцию область () для достижения независимости. Этополиморфный общего пользования.С полиморфизма, вы можете иметь несколько различных классов, все с тем же именем, но с параметром функции, функция может даже иметь различные реализации одного и того же.

Виртуальная функция

Виртуальная функция объявлена с помощью ключевого слова в виртуальнойфункции базового класса. Когда Redefine виртуальной функции базового класса определяется в производном классе, он говорит компилятор не статически связан с функцией.

То , что мы хотим , чтобы любая точка в программе могут быть выбраны в соответствии с типом вызовов функций объекта вызывается, эта операция называетсядинамическое связывание, или позднего связывания.

Чистая виртуальная функция

Вы можете определить виртуальную функцию в базовом классе, так что производный класс переопределить функцию лучше всего подходит для данного объекта, но вы не можете дать содержательную реализацию виртуальных функций в базовом классе, на этот раз будет использовать чистую виртуальную функцию.

Мы можем базового класса виртуальную область функции () следующим образом:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // pure virtual function
      virtual int area() = 0;
};

= 0 указывает компилятору , что функция не имеет тела, выше виртуальная функция являетсячисто виртуальная функция.