Полиморфизм С++
C++ — это объектно-ориентированный язык программирования со многими мощными функциями, включая полиморфизм. Полиморфизм означает, что разные свойства объектов могут вести себя одинаково. В C++ существует два типа полиморфизма: полиморфизм времени компиляции и полиморфизм времени выполнения.
полиморфизм времени компиляции
Полиморфизм времени компиляции достигается за счет перегрузки функций и шаблонов. Перегрузка функций относится к определению нескольких функций с одинаковыми именами, но разными типами параметров в одной и той же области. Компилятор C++ выберет, какую функцию вызывать, основываясь на типах параметров в вызове функции. Например:
void print(int num) {
cout << "Integer: " << num << endl;
}
void print(double num) {
cout << "Double: " << num << endl;
}
int main() {
int a = 5;
double b = 3.14;
print(a);
print(b);
return 0;
}
Результат:
Integer: 5
Double: 3.14
Шаблоны — это общий механизм программирования, который можно использовать для создания функций или классов с одинаковой структурой кода, но разными типами данных. Например:
template<typename T>
void print(T num) {
cout << "Value: " << num << endl;
}
int main() {
int a = 5;
double b = 3.14;
print(a);
print(b);
return 0;
}
Вывод такой же, как в приведенном выше примере.
полиморфизм времени выполнения
Полиморфизм во время выполнения достигается за счет виртуальных функций и наследования. Виртуальная функция относится к функции, объявленной как виртуальная функция в базовом классе, которая может быть переопределена в производном классе.Когда объект производного класса вызывает эту функцию, он вызывает функцию в производном классе вместо функции в производном классе. базовый класс. Например:
class Shape {
public:
virtual void draw() {
cout << "Drawing a generic shape." << endl;
}
};
class Rectangle : public Shape {
public:
void draw() {
cout << "Drawing a rectangle." << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Drawing a circle." << endl;
}
};
int main() {
Shape* shape1 = new Rectangle();
Shape* shape2 = new Circle();
shape1->draw();
shape2->draw();
return 0;
}
Результат:
Drawing a rectangle.
Drawing a circle.
Наследование означает, что производные классы могут наследовать переменные-члены и функции-члены базового класса. Например:
class Animal {
public:
void speak() {
cout << "Generic animal sound." << endl;
}
};
class Dog : public Animal {
public:
void speak() {
cout << "Bark!" << endl;
}
};
int main() {
Animal* animal1 = new Animal();
Animal* animal2 = new Dog();
animal1->speak();
animal2->speak();
return 0;
}
Результат:
Generic animal sound.
Bark!
Приложения
Полиморфизм можно применять ко многим сценариям, таким как элементы управления в программировании графического интерфейса, персонажи и неигровые персонажи в разработке игр и так далее. Ниже приведен простой случай применения:
class Shape {
public:
virtual void draw() = 0;
};
class Rectangle : public Shape {
public:
void draw() {
cout << "Drawing a rectangle." << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Drawing a circle." << endl;
}
};
int main() {
vector<Shape*> shapes;
shapes.push_back(new Rectangle());
shapes.push_back(new Circle());
for (int i = 0; i < shapes.size(); i++) {
shapes[i]->draw();
}
return 0;
}
Результат:
Drawing a rectangle.
Drawing a circle.
В этом примере мы использовали чистые виртуальные функции и векторные контейнеры для управления несколькими объектами формы. Будь то прямоугольник или круг, его можно нарисовать, вызвав ту же функцию draw().
Таким образом, полиморфизм в C++ — очень полезный механизм программирования, повышающий гибкость и возможность повторного использования кода. При соответствующих обстоятельствах рекомендуется использовать полиморфизм для оптимизации структуры кода и повышения эффективности программы.