纯虚函数和虚函数有什么区别?我知道"纯虚函数是没有函数体的虚函数",但这意味着什么?下面这行代码实际上执行了什么操作:
virtual void virtualfunctioname() = 0
纯虚函数和虚函数有什么区别?我知道"纯虚函数是没有函数体的虚函数",但这意味着什么?下面这行代码实际上执行了什么操作:
virtual void virtualfunctioname() = 0
虚拟函数使其所在的类成为一个多态基类。派生类可以重写虚拟函数。通过基类指针/引用调用的虚拟函数将在运行时解析。也就是说,对象的动态类型而不是静态类型将被使用:
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不同,Java有一个关键字来显式声明抽象类),抽象类不能被实例化。派生类需要重写/实现所有继承的纯虚函数。如果不这样做,则它们也将变为抽象类。
C ++的一个有趣的“特性”是,类可以定义具有实现的纯虚函数。(这有争议的用法。)
请注意,C++11引入了一个新的用途,使用delete
和default
关键字,其语法类似于纯虚函数:
my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;
=0
”。 - thecoshman对于虚函数,您需要在基类中提供实现。但派生类可以覆盖此实现以提供自己的实现。通常情况下,对于纯虚函数不提供实现。您可以在函数声明末尾添加 =0
来使函数成为纯虚函数。同时,包含纯虚函数的类是抽象的,即无法创建该类的对象。
纯虚函数通常不会(但可以)在基类中实现,并且必须在叶子子类中实现。
您可以通过在声明中附加 "= 0" 来表示这一事实,就像这样:
class AbstractBase
{
virtual void PureVirtualFunction() = 0;
}
如果你的子类没有实现纯虚函数,那么你就不能声明和实例化该子类:
class Derived : public AbstractBase
{
virtual void PureVirtualFunction() override { }
}
通过添加override
关键字,编译器将确保有一个与基类的虚函数同名同参的函数存在。