纯虚方法只能在直接派生类中实现——为什么?
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.
纯虚拟并不排除实际定义,允许非虚拟调用。
假设有一个抽象 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.
纯虚拟并不排除实际定义,允许非虚拟调用。