通过在派生类中使其成为纯虚函数来"隐藏"基类虚函数是否有效?

usr*_*usr 19 c++ language-lawyer c++11

考虑这个例子:

#include <iostream>

class A {
    public:
    virtual void f();
};

void A::f()
{
    std::cout << "f() from A\n";
}

class B: public A {
    public:
    virtual void f() = 0;
};

class C: public B {
    public:
    void f();
};

void C::f()
{
    std::cout << "f() from C\n";
}

int main()
{
    C o;
    o.f();
}
Run Code Online (Sandbox Code Playgroud)

A::f()实现从C类"隐藏",它提供了自己的实现f()- 有效地使A::f()或多或少无意义.我认为这种类层次结构设计没什么价值,但我的问题是这是一个有效的C++还是只是"有效"(例如未定义的行为)?

Ste*_*ner 22

标准明确允许和支持(例如,参见在线C++标准草案),因此显然不是未定义的行为:

10.4抽象类

5 [注意:抽象类可以从非抽象的类派生,纯虚函数可以覆盖不纯的虚函数. - 结束说明]

结果是你的类B变得抽象,任何子类 - 如果它也不是抽象的 - 必须定义f(); A仍然可以通过调用类中的实现,A::f()从重用实现的角度来看,它是没有意义的.