我有三个课程:B
,D
和G
。 D
是B
,G
是D
。 B
和D
都是抽象的。 B
来自第三方。
B
有一个G
需要实现的非纯虚拟方法(成为D
)。我可以 重新定义/覆盖虚拟功能是纯虚拟的好习惯吗?
示例:
class B // from a third party
{
public:
virtual void foo();
};
class D : public B
{
public:
void foo() override = 0; // allowed by gcc 4.8.2
virtual void bar() = 0;
};
class G : public D
{
public:
// forgot to reimplement foo
void bar() override;
};
int main()
{
G test; // compiler error is desired
}
关于“我可以吗?”的问题gcc允许它,但我没有术语/词汇表来验证行为是标准的一部分,还是未定义,并且恰好在今天工作。
答案 0 :(得分:23)
你问:
我可以使用纯虚拟功能覆盖虚拟功能吗?
答案是:是的,你可以。从C ++ 11标准:
10.4抽象类
5 [注意:抽象类可以从非抽象的类派生,纯虚函数可以覆盖不纯的虚函数。 - 结束记录]
答案 1 :(得分:2)
如果使用更现代的编译器编译代码,那么您将收到以下错误消息来解释问题
prog.cc:23:6: error: variable type 'G' is an abstract class
G test; // compiler error is desired
^
prog.cc:10:9: note: unimplemented pure virtual method 'foo' in 'G'
void foo() override = 0; // allowed by gcc 4.8.2
^
1 error generated.
至于标准(10.3虚拟功能)
11定义中声明的虚拟函数,或 在该类中声明纯粹(10.4),或两者兼而有之;但没有诊断 要求(3.2)。