我有一个现有的类,它声明了一个虚方法并定义了一个默认实现。现在我想用differend参数重载该方法,并给出一个默认实现。另外我想强制执行约束,如果第一个方法被子类覆盖,那么第二个(重载)虚拟方法也必须被覆盖。
这在C ++中是否可行?如果是这样,是否可以在编译时?
示例代码:
class ParamA {};
class ParamB {};
class Base
{
public:
virtual void method(ParamA a)
{
// default behavior
}
virtual void method(ParamB b)
{
// default behavior
}
}
class Derived : public Base
{
public:
virutal void method(ParamA)
{
// special behavior
}
}
我的目标是检测Derived
类型的类并强制执行它们method(ParamB b)
的验证。
答案 0 :(得分:5)
不,您不能指定必须覆盖哪些成员函数集的复杂约束。唯一的限制适用于个别职能;纯虚拟(=0
)要求覆盖,(在C ++ 11中)final
以防止覆盖。
您可以做的最好的事情是使两个函数都是纯虚拟的,强制派生类重写两者。这至少迫使衍生类的作者思考什么需要压倒一切;它是不可能覆盖一个而忘记另一个。
您仍然可以提供默认实现,因此不想覆盖任何一个函数的派生类只需要非常短的覆盖来调用默认版本。
答案 1 :(得分:1)
我认为C ++没有提供任何方法来检测孩子的这种遗漏覆盖。
@larsmans:将两个方法都设为纯虚拟导致缺少默认实现。
@js_:您能详细说明一下您的实际问题吗?你在寻找什么似乎在概念上对我来说并不是那么清楚。
答案 2 :(得分:0)
如何创建Base
将继承的Parent类?这两个函数在Parent类中将是纯虚函数。派生类将继承Parent(而不是Base
),并且必须实现这两个函数。
答案 3 :(得分:0)
如果您需要使用的是父类,那么不。它既不能在编译时也不可能作为运行时检查。
当然,你可以介绍一些宏(比如说OVERRIDE_METHODS ......我确定你会看到我在说什么),但没有什么可以阻止用户忽略它们并只覆盖其中一种方法。 / p>
另外这些宏会让代码变得非常难看。