我有一个带有可选虚函数的基类
class Base {
virtual void OnlyImplementThisSometimes(int x) {}
};
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我得到一个关于未使用的param x的警告.还有其他方法我应该实现虚拟功能吗?我重写了这样的话:
class Base {
virtual void OnlyImplementThisSometimes(int x)
{
x = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
我还有一个问题,如果我不小心,我制作的子类可以实现错误的功能,然后由于重载我没有注意到:例如
class Derived : public Base {
void OnlyImplementThisSometimes(int x, int y) { // some code }
};
Derived d;
Base *b = dynamic_cast<Base *>(&d);
b->OnlyImplementThisSometimes(x); // calls the method in the base class
Run Code Online (Sandbox Code Playgroud)
调用基类方法是因为我使用"int y"参数实现了派生函数,但没有对此进行警告.这些只是C++中常见的陷阱还是我误解了虚函数?
小智 22
忽略设计问题,您可以通过省略变量名来绕过编译器警告有关未使用的变量,例如:
virtual void OnlyImplementThisSometimes(int ) { }
Run Code Online (Sandbox Code Playgroud)
在尝试覆盖虚函数时错误地实现了错误的方法签名只是在C++中需要注意的事情.C#等语言使用'override'关键字来解决这个问题.
Gra*_*row 11
我们将宏定义_unused为:
#define _unused(x) ((void)x)
Run Code Online (Sandbox Code Playgroud)
然后将函数定义为:
virtual void OnlyImplementThisSometimes(int x) { _unused( x );}
Run Code Online (Sandbox Code Playgroud)
这不仅使编译器不会抱怨,而且让任何维护代码的人都明白你没有忘记x - 你故意忽略它.
| 归档时间: |
|
| 查看次数: |
4834 次 |
| 最近记录: |