注意:我不问这是否合理,还是设计好。我只是问这是否是定义明确的行为,以及结果是否符合预期。
我遇到了下面的类层次结构:
struct A
{
virtual void foo() = 0;
};
struct B: public A
{
void foo() override
{
std::cout << "B::foo()\n";
}
};
struct C: public B
{
virtual void foo() = 0;
};
struct D: public C
{
void foo() override
{
std::cout << "D::foo()\n";
}
};
int main()
{
A* d = new D;
d->foo(); //outputs "D::foo()"
// A* c = new C; // doesn't compile as expected
}
此代码定义是否正确?我们是否可以使用pure-specifier覆盖定义?
编辑:我不确定C
是否实际上是覆盖。该假设可能是错误的。
struct E: public C
{
using B::foo;
};
//E is still abstract
当前标准草案的[[class.abstract/5]:
[注:抽象类可以从非抽象的类派生,并且一个纯虚函数可能会覆盖一个非纯虚函数。 — 尾注]