虚函数和纯虚函数之间的区别

Sac*_*iya 202 c++ function pure-virtual

可能重复:
C++ Virtual/Pure Virtual Explained

纯虚函数和虚函数有什么区别?

我知道"纯虚函数是一个没有正文的虚函数",但这意味着什么,以及下面这一行实际完成的内容:

virtual void virtualfunctioname() = 0
Run Code Online (Sandbox Code Playgroud)

sbi*_*sbi 250

虚函数使其类成为多态基类.派生类可以覆盖虚函数.通过基类指针/引用调用的虚函数将在运行时解析.也就是说,使用对象的动态类型而不是其静态类型:

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  
Run Code Online (Sandbox Code Playgroud)

纯虚函数是一个虚函数,其声明结束于=0:

class Base {
  // ...
  virtual void f() = 0;
  // ...
Run Code Online (Sandbox Code Playgroud)

纯虚函数隐式地使它为抽象定义的类(与Java中不同,在Java中你有一个关键字来显式声明类抽象).抽象类无法实例化.派生类需要覆盖/实现所有继承的纯虚函数.如果他们不这样做,他们也会变得抽象.

C++的一个有趣的"特性"是类可以定义一个具有实现的纯虚函数.(这有什么好处值得商榷.)


请注意,C++ 11为deletedefault关键字带来了一个新用法,它看起来类似于纯虚函数的语法:

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;
Run Code Online (Sandbox Code Playgroud)

这个问题,并且这一个更多的信息在这个使用deletedefault.

  • @Nick:的确如此.只有C++才能让你获得更多的自由.(你可以在C++中实现纯虚函数,你可以在同一个类中混合纯,非纯和非虚函数.(通常最好不要这样做,但如果你需要它,你可以. ) (5认同)
  • 哦,所以纯虚函数几乎与Java/C#接口中的方法相同.整齐. (2认同)

Nav*_*een 29

对于虚函数,您需要在基类中提供实现.但是,派生类可以使用自己的实现覆盖此实现.通常,对于纯虚函数,不提供实现.您可以=0在函数声明结束时创建一个纯虚函数.此外,包含纯虚函数的类是抽象的,即您无法创建此类的对象.


Joh*_*ell 20

纯虚函数通常不是(但可以)在基类中实现,必须在叶子类中实现.

您通过在声明中附加"= 0"来表示这一事实,如下所示:

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,如果没有实现纯虚函数,则无法声明和实例化子类:

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}
Run Code Online (Sandbox Code Playgroud)

通过添加override关键字,编译器将确保存在具有相同签名的基类虚函数.

  • 在C++中,可以实现纯虚函数. (3认同)
  • 是的,对于纯虚拟析构函数,必须实现它. (3认同)

Ash*_*ain 8

实际上,您可以在C++中提供纯虚函数的实现.唯一的区别是所有纯虚函数必须在派生类之前实现,才能实例化.