c++ - 为什么我们实际上需要运行时多态性?

标签 c++ oop polymorphism

我试图理解多态性,但我不明白如果静态多态性可以很好地调用类的成员,为什么我们需要运行时多态性。

就像,假设这是一个问题。

#include <bits/stdc++.h>
using namespace std;
class base{
    public:
        virtual void fun(){
            cout<<"base called"<<endl;
        }
};
class derived:public base{
    public:
        void fun(){
            cout<<"derived called"<<endl;
        }
};
int main() {

    base b,*b1;
    derived d;
    b1 = &d;
    b1->fun();
    // b.fun();
    // d.fun();
}

假设这是我的代码,我想访问派生类或基类的函数,我可以通过简单地创建该类的对象来做到这一点,所以如果没有问题,那么为什么我们尝试使用引用调用对象(运行时多态性)。
有人可以解释对运行时多态性的实际需求吗,或者如果可能的话,您可以使用任何 来解释它吗?真实场景 ??

最佳答案

多态性被认为是面向对象编程的重要特征之一。 C++中的多态主要分为两种:

  • 编译时多态 :这种类型的多态是通过函数重载或运算符重载来实现的。
  • 运行时多态 :这种类型的多态是通过函数覆盖来实现的。

  • 现在考虑以下场景。

    假设我们有一个名为 Shape 的基类它具有以下界面。

    class Shape {
    public:
        Shape(int init_x, int init_y);
        virtual ~Shape() = default;
    
        virtual void scale(int s) = 0;
    protected:
        int x;
        int y;
    };
    

    现在我们要继承另外两个名为 Rectangle 的类。和 Circle从中。

    class Rectangle : public Shape {
    public:
        Rectangle(int init_x, int init_y, int w, int h);
        void scale(int s) override;
    private:
        int width;
        int height;
    };
    

    class Circle : public Shape {
    public:
        Circle(int init_x, int init_y, int r);
        void scale(int s) override;
    private:
        int radius;
    };
    

    您可能知道,圆形和矩形的 scale 有不同的实现。方法,所以我无法在 Shape 中实现它类(class)。

    现在假设我们有一个程序将所有形状存储在一个容器中,如 vector<Shape*>。 (例如,它一次从用户那里获取所有形状并将它们存储在此容器中)。

    如果我们想使用 scale方法,我们实际上不知道我们正在处理哪种形状,但它会绑定(bind)我们的 scale方法调用其适当的实现。

    关于c++ - 为什么我们实际上需要运行时多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62113098/

    相关文章:

    c++ - 为什么我应该显式地将类型名传递给 std::forward?

    c++ - 我可以将指针转换为我的类吗?

    相互依赖的类的 C++ 继承

    java - 是否有比使用 if-else 语句(或 switch)更面向对象的方法来选择基于字符串的类?

    c++ - 如何扩展库类的功能?

    c++ - 如何通过用户输入打印一周中的 7 天?

    c++ - 在 C++ 中,我们可以使用 { } 进行 C 风格转换吗?

    PHP 不存储 session ID

    c++ - 如何使继承相同基类的类的虚方法弄清楚如何处理它们的参数?

    c++ - 在将指针传递给函数后,如何向下转换指针?