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

C++ 两次(在层次结构中的两个类中)声明纯虚函数是否完全合法,c++,inheritance,pure-virtual,C++,Inheritance,Pure Virtual,这个问题的标题很清楚。下面是我所说的例子: 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()都是虚拟的,这一事实没有考虑在内

这个问题的标题很清楚。下面是我所说的例子:

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中定义的函数时都会调用。

@Simple-引用标准中的一些内容或其他内容?@Kiril Kirov如果有,则是aAnswer而不是注释:PI不明白为什么这值得投反对票,但是..我也不认为这是一个好问题。考虑到虚拟方法(通常)是如何实现的,这应该不会引起任何问题:
B
的虚拟方法表将只包含
f
的空指针,而不包含。。。空指针(可能不是空指针,但你明白我的意思)。当然,这不是一个确定的答案,因为它假设了一个特定的实现,但我真的不明白为什么标准会不允许这样的事情。不过,这只是一个观点,我没有时间去挖掘标准来找到相关的引用。我真的不明白你的意思。它是纯虚拟的,没有实现。它是重写,而不是重载,这在这里很重要。是的,我的意思是重写。很抱歉但是,也许我没有领会你的意思…:-/。对我来说,基于函数各自的类型没有可能的混淆。因此,它们并不“相同”。