内部编译器如何识别类是一个抽象的(我们无法为其创建对象)?
一个抽象类将包含至少一个纯虚函数。像这样的东西
virtual void foo() = 0;
任何派生自此且不覆盖此类函数的类也将是抽象的
编译器足够聪明,可以检查类或它派生的任何类中的纯虚函数。
如果类本身定义了一个纯虚函数[Ref 1],则无论它是否定义函数体,它都会被标记为抽象类。
如果一个类继承自具有纯虚函数的类,那么它必须为纯虚函数提供一个定义。如果不是,则标记为抽象。
[参考文献 1]
virtual void doSomething() = 0;
^^^^^
PS:是的,纯虚函数可以有一个定义。
当然,通过检查定义并查看它是否在抽象类的定义范围内。否则会怎么发生?
如果类至少有一个成员是抽象的,则类是抽象的。因此,如果类包含至少一个纯虚函数,那么从编译器的角度来看,它是抽象的。
virtual void PureVirtualMethod() = 0; // Any class that has methods
// with such declaration is abstract.