【发布时间】:2021-08-08 06:54:36
【问题描述】:
我想知道以下是否可能。我希望我的派生类 dA 将 func() 更改为纯虚拟,以便从 dA 派生的任何类都必须实现 func()。
即使ddA 没有实现func(),也可以在MSVC 下编译类似于下面的代码。
编译器确实抱怨以下代码(请参阅 cmets)。所以我现在的问题变成了:这是一种符合标准的方式来实现我想要的吗?
class A {
public:
virtual void func() { /* Some base implementation. */ }
}
class dA : public A {
public:
void func() override = 0; // Is this valid?
}
class ddA : public dA {
}
【问题讨论】:
-
这能回答你的问题吗? Delete virtual function from a derived class
-
即使
ddA没有实现func(),与下面类似的代码在MSVC 下编译也不会出现问题。 您是否尝试过创建ddA的实例。我试图在 g++ 中重现。你的例子没有抱怨编译。一旦我添加了ddA obj;,这种情况就发生了变化,因为现在这是一个问题。 (如果func()没有被覆盖和定义,抽象类可能不会被实例化,ddA就是这样。)Test on coliru -
除此之外,我已经使用了派生类,即使基类已经实现了它,它们也会使重写的函数成为纯虚拟函数。我明确地这样做是为了使中间类不能实例化。 AFAIK,这没有任何问题,我从未注意到编译器对此有任何意外行为。 (我用的是VS2019,VS2013、VS2008都用过。)
-
@Scheff 你是对的,如果我添加
ddA obj,它的行为与我预期的一样。我忘记了在我的类的情况下,它只在运行时通过脚本(通过元对象系统)被实例化,所以编译器不知道实例化。更新了问题。 -
恕我直言,这不会改变任何事情。即使是元系统也必须在某处
new实例。这要么会抱怨不完整的类,要么(如果它是通过 hacky 技巧实现的)当某些东西试图从 v-table 为纯虚函数调用nullptr时,你会遇到崩溃。 (我曾经以某种方式做到了这一点,尽管我不记得我是如何做到这一点的了,在这种情况下这显然是我的错......)
标签: c++ inheritance pure-virtual