问题的标题很清楚。这就是我的例子:
class A
{
public:
virtual void f() = 0;
};
class B: public A
{
public:
virtual void f() = 0;
};
class C: public B
{
public:
virtual void f() {}
};
答案 0 :(得分:2)
是的,这是合法的,因为根本没有相同的功能。 B::f()
函数覆盖了A::f()
。在这两种情况下f()
都是虚拟的这一事实并未考虑在内。
答案 1 :(得分:2)
是的,这完全合法。
在大多数情况下,B中f()的声明不会以任何方式改变程序的含义,但是有一点冗余并没有错。
回想一下,“= 0”只表示该类可能无法直接实例化;在实例化对象之前,必须覆盖所有纯虚函数。
您甚至可以为纯虚函数提供定义,可以在子类的实例上调用。通过明确声明B :: f(),您可以选择为B :: f()提供定义。
答案 2 :(得分:1)
这三个f()函数是不同的,但在两个类中声明相同的虚函数是合法的,因为A中的f()在B中的F()中被重写。 它的函数调用取决于类对象。
因此根据上面的代码,您没有权限创建A类和B类的实例。因此每次调用C类内部的函数时都会被调用。