虚函数和纯虚函数的区别

纯虚函数和虚函数的区别是什么?

我知道“纯虚函数是一个没有主体的虚函数”,但这意味着什么,下面这行实际上做了什么:

virtual void virtualfunctioname() = 0
409805 次浏览

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

你可以通过在声明后附加“= 0”来表示这个事实,就像这样:

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

然后你不能声明和实例化一个子类,除非它实现了纯虚函数:

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

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

虚函数使其类为多态基类。派生类可以重写虚函数。通过基类指针/引用调用的虚函数将在运行时解析。也就是说,使用对象的动态类型来代替它的静态类型:

 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中,你有一个关键字显式声明类抽象)。抽象类不能被实例化。派生类需要重写/实现所有继承的纯虚函数。如果不这样做,它们也会变得抽象。

c++的一个有趣的“特性”是类可以定义具有实现的纯虚函数。 (这有什么好处是有争议的。)< / p >

注意,c++ 11带来了deletedefault关键字的新用法,看起来类似于纯虚函数的语法:

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

有关deletedefault使用的更多信息,请参阅这个问题这一个

对于虚函数,需要在基类中提供实现。然而,派生类可以用它自己的实现覆盖这个实现。通常,对于纯虚函数不提供实现。你可以在函数声明的末尾使用=0使函数成为纯虚函数。同样,包含纯虚函数的类是抽象的,即你不能创建该类的对象。

你实际上可以在c++中提供纯虚函数的实现。唯一的区别是,所有纯虚函数都必须由派生类实现,然后才能实例化该类。