纯虚方法只能在直接派生类中实现——为什么?

Pure virtual method must be implemented only in immediate derived classes - why?

假设有一个抽象 class A 和两个 class 派生自 A 和 [=2] B & C =]分别

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的祖父类的角度来看A,print()是一个纯虚方法。那么,它不应该也需要在 C 中实现吗?

C 不会 "care" 它如何获得实现,只是它获得了一个。它从 B 中获取一个。但是 B 没有收到 print 的实现,因此需要自己实现 print

编辑:根据下面的评论,不得再次将实现标记为纯虚拟

您需要定义所有 ODR 使用的内容,虚函数始终由 class(vtable)使用 ODR。

当然,除非它们被标记为纯虚拟。

一个 class 是抽象的,因此不能被实例化,当且仅当它至少有一个纯虚拟成员。
该成员是否被继承并不重要,但继承只是直接从base-classes.

纯虚拟并不排除实际定义,允许非虚拟调用。