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

时间:2013-11-22 12:31:49

标签: 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() {}
};

3 个答案:

答案 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类内部的函数时都会被调用。