【发布时间】:2020-06-17 23:26:46
【问题描述】:
注意:我不问这样做是否合理,或者这是否是好的设计。我只是问这是否是定义明确的行为以及结果是否符合预期。
我遇到了以下类层次结构:
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
}
这段代码定义明确吗?我们是否允许使用纯说明符覆盖定义?
【问题讨论】:
-
也许,您可以添加标签 [language-lawyer],因为它是关于语言规范的?
-
我猜你不能实例化
C如果它是抽象的。另一方面,我会说覆盖和覆盖函数不是一个好习惯,在这种情况下你会使用它吗? -
@MartinMorterol 已添加,谢谢!
-
@Ivan 恐怕它已经存在于我们的代码中,不幸的是它通过了我们的代码审查。我只是想知道这是否可以做(以及它实际上在做什么)。
标签: c++ overriding language-lawyer pure-virtual