代码之家  ›  专栏  ›  技术社区  ›  Naruto

运行时多态性到底意味着什么?

  •  2
  • Naruto  · 技术社区  · 16 年前

    我对运行时多态性有点困惑。如果我错了,请纠正我,但据我所知,运行时多态性意味着函数定义将在运行时得到解析。

    举个例子:

    class a
    {
    a();
    ~a();
    void baseclass();
    }
    
    class b: class a
    {
    b();
    ~b();
    void derivedclass1();
    }
    
    class c: class a
    {
    c();
    ~c();
    void derivedclass2();
    }
    

    调用方法:

    b derived1;
    a *baseptr = &derived1; //here base pointer knows that i'm pointing to derived class b. 
    baseptr->derivedclass1();
    

    那么,歧义在哪里存在呢?

    6 回复  |  直到 15 年前
        1
  •  5
  •   liaK    16 年前

    所提供的示例中不存在歧义。

    在这种情况下,您可以使用 virtual 关键字,以确保函数从当前指向的对象调用。它在运行时解决。

    Here 你可以找到更多的解释。。

        2
  •  10
  •   anon anon    16 年前

    这段代码在运行时根据实际创建的对象类型(A或B)调用f()的正确版本-没有“歧义”。在编译时无法知道该类型,因为它是在运行时随机选择的。

    struct A {
       virtual ~A() {}
       virtual void f() {}
    };
    
    struct B : public A {
       virtual void f() {}
    };
    
    
    int main() {
       A * a = 0;
       if ( rand() % 2 ) {
          a = new A;
       }
       else {
          a = new B;
       } 
       a->f();   // calls correct f()
       delete a;
    }
    
        3
  •  1
  •   DumbCoder    16 年前

    把这个转过来

    void baseclass();
    

    到

    virtual void baseclass();
    

    b *derived1 = new derived1 ();
    a *baseptr = derived1; //base pointer pointing to derived class b. 
    baseptr->baseclass();
    

    Some basic reading material for polymorphism

        4
  •  1
  •   cybevnm    16 年前

    运行时意味着只有在运行时才知道确切的方法。考虑这个例子:

    
    class BaseClass
    {
    public:
      virtual void method() {...};
    };
    
    class DerivedClassA : public BaseClass
    {
      virtual void method() {...};
    };
    
    class DerivedClassB : public BaseClass
    {
      virtual void method() {...};
    };
    
    void func(BaseClass* a)
    {
      a->method();
    }
    

    当您实现::func()时,您不知道基类*a所指向的实例的确切类型。它可能是DerivedClassA或DerivedClassB实例等。
    您应该意识到,运行时多态性需要来自语言的特殊支持(可能还有一些调用“虚拟”函数的开销)。在C++中,通过声明基类“虚”和使用公共继承的方法来“请求”动态多态性。

        5
  •  0
  •   djna    16 年前

    您需要在基类和每个派生类中声明一些有用的业务方法。然后你有这样的代码

     a->someMethod();
    

    现在a指针可能指向任何派生类的实例,因此a所指向的类型必须决定调用哪个someMethod()。

        6
  •  0
  •   Tunvir Rahman Tusher    13 年前

    #include <iostream>
    using namespace std;
    class aBaseClass
    {
    
    public:
    
        void testFunction(){cout<<"hello base";}///Not declared as virtual!!!!
    
    };
    class aDerivedClass:public aBaseClass
    {
    public:
        void testFunction(){cout<<"hello derived one";}
    };
    
    class anotherDerivedClass:public aDerivedClass
    {
    public:
        void testFunction(){cout<<"hello derived two";}
    
    };
    int main()
    {
        aBaseClass *aBaseClassPointer;
        aBaseClassPointer=new aDerivedClass;
        aBaseClassPointer->testFunction();
    }
    

    上面的代码不支持运行时多态性。让我们运行并分析它。 输出为

    hello base
    

    换条线就行了 void testFunction(){cout<<"hello base";} virtual void testFunction(){cout<<"hello base";} 在里面 aBaseClass

    再换一次线 aBaseClassPointer=new aDerivedClass aBaseClassPointer=new anotherDerivedClass 在main函数中查看输出。因此,在运行时(程序运行时)确定适当的函数调用。