纯虚方法必须只在直接派生类中实现 - 为什么?

时间:2015-01-07 15:02:08

标签: c++ class derived-class pure-virtual

假设有一个抽象类A和两个类B& C分别来自AB

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&#39; s祖父母A的透视图,print()是纯粹的虚方法。那么,它是否也需要在C中实现呢?

2 个答案:

答案 0 :(得分:5)

C并不“关心”它如何获得实现,只是它得到一个。它从B得到一个。但是,B未收到print的实施,因此需要自行实施print

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

答案 1 :(得分:0)

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

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

一个类是抽象的,因此如果它至少有一个纯虚拟成员,则无法实例化 无论该成员是否继承都无关紧要,但继承只能直接来自基类。

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