虚函数和纯虚函数的区别

可能重复:
C ++虚拟/纯虚拟解释

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

我知道“纯粹的虚拟function是一个虚拟的function,没有身体”,但这是什么意思,实际上是由下面的行:

virtual void virtualfunctioname() = 0 

一个虚函数使得它的类成为一个多态的基类 。 派生类可以覆盖虚函数。 通过基类指针/引用调用的虚函数将在运行时parsing。 也就是说,使用对象的dynamictypes而不是其静态types

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

纯虚函数是一个虚函数,其声明以=0结尾:

 class Base { // ... virtual void f() = 0; // ... 

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

C ++的一个有趣的“function”是一个类可以定义一个具有实现的纯虚函数。 ( 这有什么好处是值得商榷的 。)


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

 my_class(my_class const &) = delete; my_class& operator=(const my_class&) = default; 

看到这个问题 , 这一个更多的信息在这个使用deletedefault

对于一个虚函数,你需要在基类中提供实现。 然而,派生类可以用自己的实现覆盖这个实现。 通常,对于纯虚函数,不提供实现。 你可以在函数声明结束时用=0做一个纯虚函数。 另外,一个包含纯虚函数的类是抽象的,即你不能创build这个类的对象。

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

您通过在声明中附加“= 0”来表示该事实,如下所示:

 class AbstractBase { virtual void PureVirtualFunction() = 0; } 

那么你就不能声明和实例化一个没有实现纯虚函数的子类:

 class Derived : public AbstractBase { virtual void PureVirtualFunction() override { } } 

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

实际上你可以用C ++ 提供纯虚函数的实现 。 唯一的区别是所有的纯虚拟函数必须在派生类实现之前由派生类实现。