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