0在纯虚拟函数中的含义
what 0 means in pure virtual function
下面的程序没有编译,原因很明显:
#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还是只是语法约束?
- 如果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++设计者可以选择使用pure
或abstract
来代替= 0
。我怀疑不这样做的唯一原因是他们不想在语言中引入新的保留字(因为这会破坏任何已经使用新保留字作为标识符的现有代码)。
(没有必要保留这样一个词,因为它将是一个上下文敏感的关键字,但上下文敏感关键字的概念最近才进入主流用法,而且这种语法要古老得多。)
函数声明中的= 0
只是语法:token序列意味着函数是纯的,仅此而已。和您不能用任何其他东西替换任何一个令牌:例如,=
0L
是不合法的。
您出现错误的原因很简单,因为不允许使用语法。出于历史原因,如果没有其他原因的话。如果你想为纯虚拟函数提供一个定义,你必须在课外做这件事。
如果你提供了一个纯虚拟函数的定义,您可以从构造函数调用它;你只需要停用所述虚拟呼叫机制;例如CCD_ 10。如果实际的函数调用涉及动态解析解析会产生一个纯虚拟函数,它是未定义的行为,而不管是否定义了函数。这里的动机是允许你不去定义它;正常地无论是否调用虚拟函数,都必须定义它,因为编译器必须将其地址放在vtable
中,并且如果没有定义,就没有地址。制作函数纯虚拟告诉编译器,它不应该将地址在CCD_ 12中。所以你不必定义它。但是如果您尝试通过vtable。
虚函数后的= 0
表示"这是纯虚函数,必须在派生函数中实现"。与您的示例一样,仍然可以实现该函数。它没有其他意义——你不能使用其他数字、地址或其他任何东西。使用=0
可以有多个函数,它的含义仍然相同。
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 虚拟继承基构造函数消除
- "虚拟""覆盖"析构函数
- 类中的虚拟布尔函数参数不起作用
- 用纯虚拟函数兜圈子
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 声明析构函数虚拟就足够了吗?
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- 重载函数(虚拟/非虚拟)