【问题标题】:C++ Is a pure virtual function also a definition or only a declaration?C++ 纯虚函数也是定义还是声明?
【发布时间】:2019-07-28 14:34:31
【问题描述】:

在 C++ 编程课程中,我了解了定义和声明之间的区别。没有函数体的函数是声明,具有函数体的函数是定义。后来我了解了纯虚函数。纯虚函数没有函数体,但它使用= 0;“初始化”。这是否意味着纯虚函数是定义还是仅被视为声明?

编辑:我不认为这是 pure virtual function with implementation 的重复,因为问题“这是否意味着纯虚函数是定义还是仅被视为声明?”没有回答。

【问题讨论】:

  • @Yunnosch “纯虚函数”绝对是 C++ 中的一个东西——没有“抽象函数”这样的东西。有“抽象类”之类的东西。
  • @Neil 我研究了一下。关于“纯虚函数”是一个清晰易懂的术语,您似乎是对的。谢谢。但是,我的“抽象函数”也可以找到——诚然,这种情况很少见。不过,感谢您纠正我。
  • “纯虚函数没有函数体”但可以。
  • @Yunnosch -- C++ 标准定义和使用术语“纯虚函数”和“抽象类”。它不使用术语“抽象函数”。

标签: c++ declaration definition virtual-functions pure-virtual


【解决方案1】:

虚拟函数是可继承和可覆盖的函数 支持动态调度的函数。理想情况下,这就是我们 调用运行时多态。简而言之,虚函数 提供要执行的目标函数,我们不知道 编译时间。假设您扩展了一个具有 virtual 的类 函数,您可以使用多态性来执行 派生类中的函数,使用基类指针。

更多阅读https://www.geeksforgeeks.org/virtual-functions-and-runtime-polymorphism-in-c-set-1-introduction/

纯虚函数或纯虚方法是虚函数 如果派生类需要由派生类实现 类不是抽象的。

需要注意的是,如果类中有纯虚函数,则不能将其实例化为对象。

看下面的例子

class Base {
public:
    virtual string getType() = 0;
}

class Derived : public base {
public:
    string getType();
}

string
derived::getType() {
    //do necessary stuff <------------------ (1)
}

Base* myBase = new Derived(); // OK
myBase->getType() //this will call the logic at (1).That's in the derived class but not base

Base* myBase2 = new Base();//Error

对于你的问题,纯虚函数是一个声明。并且不需要定义。

*EDIT 你可以提供一个默认实现,但是你必须在这个基类的派生类中用纯虚函数重写 *

【讨论】:

  • 也许我错过了,但我看不出这可以回答纯虚函数声明是否也是该函数的定义。
  • 让我也补充一下 :) 谢谢
  • "并且不需要定义" - 它不需要在声明类中定义,但如果类想要提供默认值,它可以有定义执行。派生类必须覆盖纯虚函数,但如果提供了基类的实现,它可以调用它。
  • @RemyLebeau 那么实现纯虚函数的语法是什么?
  • @tuket 与任何其他类方法相同,唯一的区别是在声明中添加了= 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2020-10-19
  • 2014-04-12
  • 2010-09-25
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多