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

问题描述 投票:0回答:2

假设有一个抽象类A和两个类BC分别派生自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的祖父tazxswpoi的角度来看,print()是一个纯粹的虚方法。那么,它不应该也需要在A中实现吗?

c++ class derived-class pure-virtual
2个回答
5
投票

C不会“关心”它如何获得实现,只是它得到一个。它从C得到一个。然而,B没有收到B的实施,因此需要自己实施print

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.