【问题标题】:Virtual C++ method with no polymorphism没有多态性的虚拟 C++ 方法
【发布时间】:2022-11-19 01:35:25
【问题描述】:

假设您有这个简单的类层次结构:

struct base {

   virtual void f () const = 0;

};

struct derived : public base {

   virtual void f () const final
   {
      ...
   }   

};

f() 只有一个实现,并且因为它被声明为 final,我们可以认为没有多态性吗?

如果是这样,编译器是否会通过避免使用虚拟表来优化代码,因为“你不支付你不使用的东西?”

谢谢你。

【问题讨论】:

  • 编译器通常不愿意在优化期间更改类布局,但调用本身确实可能被去虚拟化。为了“[这里]没有多态性”,你必须定义什么是多态性。
  • 虚函数和动态多态性是相辅相成的。缺一不可。有一种叫做静态多态的东西不需要虚函数。 (modernescpp.com/index.php/dynamic-and-static-polymorphism)
  • 编译器无法查看其他编译单元。这些其他编译单元可能从base 派生了其他类。

标签: c++ polymorphism virtual final vtable


【解决方案1】:

存在多态性,因为存在虚函数,您可以从基类定义其他派生类。

来自 C++ 17 标准(13.3 虚函数)

1 [注:虚函数支持动态绑定和 面向对象编程。 ——尾注]声明或的类 继承一个虚函数的类称为多态类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2010-11-17
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多