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

C++中虚函数的行为

  •  10
  • Summer_More_More_Tea  · 技术社区  · 16 年前

    我有一个问题,下面有两个类:

      class Base{
          public:
              virtual void toString();       // generic implementation
      }
    
      class Derive : public Base{
          public:
              ( virtual ) void toString();   // specific implementation
      }
    

    问题是:

    • 如果我想要类的子类 得到 使用类型的指针执行多向性 基地 ,括号中是否需要关键字virtual?

    • 如果答案是否定的,那么成员函数之间的区别是什么? 弦线 阶级的 得到 有没有虚拟?

    7 回复  |  直到 16 年前
        1
  •  13
  •   Potatoswatter    16 年前

    C++ 03×10

    如果虚拟成员函数vf是 在类基和 类派生、直接派生或 间接地从基部,成员 具有相同名称和 与base相同的参数列表::vf是 宣布,然后 派生::vf也是 虚拟的(不管是不是这样 宣布) 它超越了 基地::VF。

        2
  •  10
  •   UncleBens    16 年前

    这里的关键字是严格可选的,完全没有区别。

        3
  •  7
  •   suszterpatt    16 年前

    这个 virtual 属性是从基类继承的,即使您不键入它,也假定它存在。

        4
  •  1
  •   Patrick    16 年前

    编译器已经从基类中的“virtual”关键字知道toString是一个虚拟方法。不需要重复。

        5
  •  1
  •   Abhay    16 年前

    一个函数一次虚始终虚 .

    因此,在任何情况下,如果虚关键字未在后续类中使用,它都不会阻止函数/方法被“虚”化,即被重写。因此,从团队开发的角度来看,以下指导方针可能会有所帮助:

    • 如果函数/方法 被重写,始终使用 “virtual”关键字。这是特别的 在接口/基中使用时为真 类。
    • 如果派生类应该 进一步明确分类 为每个 函数/方法 重写的
    • 如果函数/方法 课程不应该是 再次分类,然后关键字 “virtual”将被注释 表示函数/方法 已被重写,但没有 重写它的其他类 再一次。这当然不能阻止 有人从凌驾于 派生类,除非该类 是最终的(不可推导的),但是 指示该方法不应是 重写的 前任: /*virtual*/ void someFunc();
        6
  •  0
  •   Tim Leaf    16 年前

    这和 编译程序 是否提供 事实上的 函数派生版本的关键字。

    但是,无论如何提供它是一个好主意,这样任何查看您的代码的人都可以知道它是一个虚拟函数。

        7
  •  0
  •   fingerprint211b    16 年前

    这是一个好风格的问题,用户程序员知道发生了什么。在C++0x中,可以使用[[OrdRe] ]使其更加显式和可见。您可以使用[[基本检查]]强制使用[[覆盖]]。

    如果您不想或不能这样做,只需使用虚拟关键字。

    如果不使用虚拟ToString进行派生,并且将派生的实例强制转换回基,则调用ToString()实际上会调用基的ToString(),因为据了解,这是基的实例。