繁体   English   中英

C ++中的动态绑定

[英]Dynamic Binding in C++

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

它不必。 如果方法在基类中声明为virtual,则在派生类中重写该方法也会使重写函数成为虚拟,即使未使用virtual关键字也是如此。

它没有。

class Base
{
    virtual void foo() {}
};

class Derived : public Base
{
    void foo() {}
}

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

是吗? 以下代码生成预期输出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;
}

引用C ++标准(10.3.2):

如果虚拟成员函数vf在类BaseDerived类中声明,直接或间接从Base Derived ,则声明具有与Base::vf相同名称和相同参数列表的成员函数vf ,然后Derived::vf也是虚拟的(无论是否如此声明)并且它覆盖 Base::vf

你可以总结一下:“一旦虚拟,总是虚拟的”。 但是,您仍然可以将virtual修饰符添加到重写成员函数,以便使用户清楚该类是多态的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM