C++ 中的动态绑定

Posted

技术标签:

【中文标题】C++ 中的动态绑定【英文标题】:Dynamic Binding in C++ 【发布时间】:2009-06-23 06:33:22 【问题描述】:

为什么派生类必须将其方法声明为虚拟才能使动态绑定起作用,即使基类的方法被声明为虚拟?

【问题讨论】:

【参考方案1】:

没必要。如果一个方法在基类中声明为虚拟,则在派生类中覆盖它也会使覆盖函数成为虚拟,即使没有使用 virtual 关键字。

【讨论】:

【参考方案2】:

它没有。

class Base

    virtual void foo() 
;

class Derived : public Base

    void foo() 

在这段代码中,foo()Derived 类中仍然是虚拟的,即使它没有被声明为这样。

【讨论】:

【参考方案3】:

是吗?以下代码产生预期的输出 B::f1()(使用 VS2008 编译):

class A

public:

    virtual ~A()
      virtual void f1()
      
        std::cout<<"A::f1()\n";
      

        virtual void f2()
      
        std::cout<<"A::f2()\n";
      
;

class B : public A

public:
       void f1()
      
        std::cout<<"B::f1()\n";
      

         void f2()
      
        std::cout<<"B::f2()\n";
      
;


int  main()

    B b;
    A* p = &b;
    p->f1();

    return 0;

【讨论】:

感谢您的回答,帮了大忙。【参考方案4】:

引用 C++ 标准 (10.3.2):

如果在类Base和类Derived中声明一个虚成员函数vf,直接或间接派生自Base,则成员函数vf具有相同的名称和相同的参数列表当 Base::vf 被声明时,Derived::vf 也是虚拟的(无论它是否被声明)并且它覆盖 Base::vf

您可以总结为:“一次虚拟,永远虚拟”。但是,您仍然可以将 virtual 修饰符添加到覆盖的成员函数中,以便让用户清楚该类是多态的。

【讨论】:

【参考方案5】:

不需要。 但我也更喜欢在派生类函数中使用 virtual,因为它会使与这些函数关联的动态绑定在阅读代码时更加清晰。

【讨论】:

以上是关于C++ 中的动态绑定的主要内容,如果未能解决你的问题,请参考以下文章

C++中的动态类型与动态绑定虚函数运行时多态的实现

深入理解C++的动态绑定和静态绑定

C++动态绑定

C++动态绑定

vtable的c ++思想中的多态性(动态绑定)

深入理解C++的动态绑定和静态绑定