假设有一个抽象类A
和两个类B
和C
分别派生自A
和B
class A
{
virtual void print() = 0;
};
class B : public A
{
void print();
};
//print() must be implemented
void B::print()
{
std::cout << "Hello" << std::endl;
}
class C : public B
{
//print() does not require to be implemented
};
我理解,从C
的直接父亲B
的角度来看,print()不是一个纯粹的虚方法,但是从C
的祖父tazxswpoi的角度来看,print()是一个纯粹的虚方法。那么,它不应该也需要在A
中实现吗?
C
不会“关心”它如何获得实现,只是它得到一个。它从C
得到一个。然而,B
没有收到B
的实施,因此需要自己实施print
编辑:根据下面的评论,不得再次将实现标记为纯虚拟
您需要为ODR使用的所有内容定义,并且虚拟函数始终由类(vtable)使用ODR。
当然,除非它们被标记为纯虚拟。
类是抽象的,因此如果它至少有一个纯虚拟成员,则无法实例化。 该成员是否继承无关紧要,但继承只能直接来自基类。
纯粹虚拟并不排除实际定义,允许非虚拟调用。