0在纯虚拟函数中的含义

what 0 means in pure virtual function

本文关键字:函数 虚拟      更新时间:2023-10-16

下面的程序没有编译,原因很明显:

#include <iostream>
using namespace std;
class A {
 public:
  A() { pVirt(); }
  virtual void pVirt() const = 0 { count<<"A::pVirt()"; }
};
int main() {
 A aObj;
 aObj.pVirt();
 reutrn 0;
}

问题:签名中的1.0"virtual void pVirt()const=0"意味着什么?,这表示vtable中的内存偏移为NULL还是只是语法约束?

  1. 如果0是NULL内存偏移量(如果是这样的话),那么为什么VC++不允许指定另一个内存地址,这就是我们不能从外部构造函数调用纯虚拟函数的原因吗(可能是因为vtable是在对象完全构造后创建的)

签名"virtual void pVirt()const=0"中的0表示什么?,

部分=0被称为纯说明符。它使虚拟函数,类抽象

纯虚拟函数不需要有定义。您可以可选地在类之外提供定义,而非抽象派生类仍然必须覆盖函数。

class A
{
 public:
     virtual ~A() {};
     virtual void f() =0;
};
void A::f() { std::cout << "A::f" << std::endl; } //optional

f的定义不会使类变得非抽象,因此您不能创建A:的实例

A a; //error - A is abstract

此外,派生类必须覆盖A::f才能成为非抽象类:

class B : public A {};
B b; //error : B is still an abstract class as it didn't override A::f

class C : public A { void f() {} };
C c; //okay : C override A::f

并且派生类实现可以选择调用基类实现:

class D : public A { void f() {  A::f(); } }; //defaults to A::f
D d; //okay : D override A::f, but calls A::f internally

希望能有所帮助。

这只是表示函数是纯虚拟函数的语法。它没有任何实际意义。C++设计者可以选择使用pureabstract来代替= 0。我怀疑不这样做的唯一原因是他们不想在语言中引入新的保留字(因为这会破坏任何已经使用新保留字作为标识符的现有代码)。

(没有必要保留这样一个词,因为它将是一个上下文敏感的关键字,但上下文敏感关键字的概念最近才进入主流用法,而且这种语法要古老得多。)

函数声明中的= 0只是语法:token序列意味着函数是纯的,仅此而已。和您不能用任何其他东西替换任何一个令牌:例如,= 0L是不合法的。

您出现错误的原因很简单,因为不允许使用语法。出于历史原因,如果没有其他原因的话。如果你想为纯虚拟函数提供一个定义,你必须在课外做这件事。

如果你提供了一个纯虚拟函数的定义,您可以从构造函数调用它;你只需要停用所述虚拟呼叫机制;例如CCD_ 10。如果实际的函数调用涉及动态解析解析会产生一个纯虚拟函数,它是未定义的行为,而不管是否定义了函数。这里的动机是允许你不去定义它;正常地无论是否调用虚拟函数,都必须定义它,因为编译器必须将其地址放在vtable中,并且如果没有定义,就没有地址。制作函数纯虚拟告诉编译器,它不应该将地址在CCD_ 12中。所以你不必定义它。但是如果您尝试通过vtable。

虚函数后的= 0表示"这是纯虚函数,必须在派生函数中实现"。与您的示例一样,仍然可以实现该函数。它没有其他意义——你不能使用其他数字、地址或其他任何东西。使用=0可以有多个函数,它的含义仍然相同。