是否可以确定/断言,如果一个虚拟函数被覆盖,另一个也被覆盖
Is it possible to determine/assert, that if one virtual function gets overridden, another one is overridden too?
我有一个现有的类,它声明了一个虚拟方法并定义了一个默认实现。现在,我想用一个不同的参数重载该方法,并给出一个默认实现。此外,我想强制执行约束,如果第一个方法被子类覆盖,那么第二个(重载的)虚拟方法也必须被覆盖。
这在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
)来强制重写,以及(在C++11中)final
来防止重写。
你能做的最好的事情就是让这两个函数都是纯虚拟的,强制派生类覆盖这两个。这至少迫使派生类的作者思考什么需要重写;不可能覆盖其中一个而忘记另一个。
您仍然可以提供默认实现,这样不想重写任何一个函数的派生类只需要调用默认版本的非常短的重写。
我认为C++没有提供任何方法来检测子级中丢失的覆盖。
@larsmans:将这两个方法都设为纯虚拟会导致丢失默认实现。
@js:你能详细谈谈你的实际问题吗?我似乎不太清楚你在搜索什么。
创建一个Base
将从中继承的Parent类怎么样?这两个函数在Parent类中将是纯虚拟的。派生类将继承Parent(而不是Base
),并且必须实现这两个函数。
如果您只需要处理父类,那么不可以。无论是在编译时还是在运行时检查时,这都是不可能的。
当然,你可以引入一些宏(比如OVERRIDE_METHODS……我相信你明白我在说什么),但没有什么能阻止用户忽略它们,只覆盖其中一个方法。
另外,这样的宏会让代码变得非常难看。
相关文章:
- 覆盖作为另一个类的好友的虚拟受保护方法
- 如何仅覆盖一个EXPECT_CALL的默认ON_CALL操作,并在以后返回到默认操作
- 即使另一个应用具有焦点,检测F1密钥的按键(和覆盖)键
- C ++如何创建一个即使对象被覆盖也会持续存在的指针?
- 当将向量设置为一个值时,整个向量会被覆盖
- 当将多个TypedArrayContents数组加载到V8数组中时(数组数组)时,最后一个元素将覆盖所有元素
- COUT:最后一个字符串覆盖第一个字符串
- c ++ 我的 char* 数组被最后一个添加的元素覆盖
- C++将向量插入到另一个覆盖向量中
- 一个类的方法覆盖另一个类的所有方法
- 我如何确定是否在编译时覆盖了一个函数
- C/C++ - 生成一个随机字符串会覆盖以前的字符串(请参阅下面的代码)
- 我如何在抽象类中声明一个超载的运算符,并在派生的非抽象类中覆盖它
- 我应该用什么来创建一个QGraphicsView覆盖,它将QMimeData封装在Qt和C++中
- 编写一个函数,该函数将覆盖主函数数组中的值
- 我可以覆盖一个抽象基类的成员吗
- 为什么我得到 C2883:函数声明与 - 在仅覆盖基类中的一个重载时通过使用 - delcaration 引入
- c++编程:询问用户是否想要覆盖一个已经存在的文件
- 如何使我的makefile覆盖一个文件
- 光不断地覆盖一个旋转立方体的两个相同的边