【问题标题】:Are abstract methods and pure virtual functions the same thing?抽象方法和纯虚函数是一回事吗?
【发布时间】:2011-09-28 07:49:13
【问题描述】:

据我所知,抽象方法和纯虚函数都不提供任何功能......所以我们可以说它们是同一件事吗?

另外,假设一个类(不一定声明为抽象)包含许多实现的方法(不是抽象的或虚拟的),但包含一个纯虚函数。那么这个类是抽象的吗?

【问题讨论】:

  • 这个问题是关于什么编程语言的?
  • 可能,但 C#、Java 和 VB.net(以及其他)也实现了类似的东西,所以它可能是其中的任何一个。

标签: c++ function virtual


【解决方案1】:

是的,它们是一回事。在 C++ 中,抽象方法只是描述纯虚函数特性的另一种方式。两者都只是意味着一个没有提供实现的方法,需要在子类中实现,然后才能实际实例化该类。

C++ 中纯虚函数和抽象类的情况是相似的,因为它们本质上意味着完全相同的东西。任何抽象类必须至少有 1 个纯虚函数,否则它可以被实例化并且不会是抽象的。同样,任何具有至少 1 个纯虚函数的类都必须是抽象的,因为需要对其进行扩展,以便实际实现方法。

因此,一个类是抽象的当且仅当它包含至少 1 个纯虚函数/抽象方法。

后来,像 Java 和 C# 这样的语言使这样的事情更加明确,允许使用特殊关键字来定义类抽象而不是纯虚拟函数的存在。 C++ 允许您做与这些语言相同的事情,但它们只是更明确一点。 :D

【讨论】:

  • 你不一定能实例化一个没有纯虚拟的类,例如如果它没有可访问的构造函数。只是迂腐:-​​)
【解决方案2】:

您没有在 C++ 中将类或方法显式声明为抽象。纯虚方法的存在使它们变得抽象。

【讨论】:

    【解决方案3】:

    是的,抽象方法与纯虚函数完全相同;这些术语经常互换使用。 IMO,“纯虚函数”是 C++ 技术上正确的术语,专门表示该函数设置为 0:

    class myClass {
    public:
      virtual void vfunc() = 0; // pure specifier
    };
    

    一个抽象类是defined by:

    一个被设计为 专门用作基类。一个 抽象类至少包含一个 纯虚函数。

    所以基本上,抽象类是抽象类,因为它被设计为基类(根据定义,某些基类需要具有可实现的方法,这些方法需要是纯虚拟的)。这些类只是通过它们的使用和扩展方式成为抽象类。与 Java 等语言不同,没有 abstract 或 interface 关键字修饰符,所以这就是为什么我们需要“口头约定”来谈论 C++ 中的抽象类。

    【讨论】:

      【解决方案4】:

      在 C++ 中,纯虚成员函数导致封闭类型成为“抽象类型”。

      函数本身不能是抽象的,尽管该术语经常以这种方式被误用。

      【讨论】:

        【解决方案5】:

        我会说是的,抽象方法和纯虚函数在概念上是一回事。

        另外,假设一个类(不一定声明为抽象)包含许多实现的方法(不是抽象的或虚拟的),但包含一个纯虚函数。那么这个类是抽象的吗?

        具有至少 1 个纯虚函数的类称为抽象类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 2021-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多