假设有一个抽象类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
&#39; s祖父母A
的透视图,print()是纯粹的虚方法。那么,它是否也需要在C
中实现呢?
答案 0 :(得分:5)
C
并不“关心”它如何获得实现,只是它得到一个。它从B
得到一个。但是,B
未收到print
的实施,因此需要自行实施print
编辑:根据以下评论,不得再次将实施标记为纯虚拟
答案 1 :(得分:0)
您需要为使用ODR的所有内容定义,并且虚拟函数始终由类(vtable)使用ODR。
当然,除非它们被标记为纯虚拟。
一个类是抽象的,因此如果它至少有一个纯虚拟成员,则无法实例化 无论该成员是否继承都无关紧要,但继承只能直接来自基类。
纯粹虚拟并不排除实际定义,允许非虚拟调用。