两次声明纯虚拟函数(在层次结构中的两个类中)是否完全合法

Is it perfectly legal to declare a pure virtual function twice (in two classes in an hierarchy)

本文关键字:两个 是否 层次结构 声明 两次 虚拟 函数      更新时间:2023-10-16

问题的标题非常清晰。以下是我举的例子:

class A
{
public:
    virtual void f() = 0;
};
class B: public A
{
public:
    virtual void f() = 0;
};
class C: public B
{
public:
    virtual void f() {}
};
是的,这是合法的,因为根本没有相同的函数。B::f()函数是对A::f()的覆盖。f()在这两种情况下都是虚拟的这一事实没有被考虑在内。

是的,这是完全合法的。

在大多数情况下,B中对f()的声明不会以任何方式改变程序的含义,但有一点冗余并没有错。

回想一下,"=0"只意味着类不能直接实例化;在实例化对象之前,必须重写所有纯虚拟函数。

您甚至可以提供纯虚拟函数的定义,该函数可以在子类的实例上调用。通过显式声明B::f(),您可以选择为B::f()给出定义。

这三个f()函数是不同的,但在两个类中声明相同的虚拟函数是合法的,因为A中的f()在B中的f()中被重写。它的函数调用依赖于类对象。

因此,根据上面的代码,您没有创建类A和B的实例的权限。因此,每次调用类C内部的函数define时都会被调用。

相关文章: