[Продвинутые знания C++] Полиморфизм C++


Полиморфизм С++

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++ — очень полезный механизм программирования, повышающий гибкость и возможность повторного использования кода. При соответствующих обстоятельствах рекомендуется использовать полиморфизм для оптимизации структуры кода и повышения эффективности программы.

Supongo que te gusta

Origin blog.csdn.net/duck251/article/details/130535284
Recomendado
Clasificación