【问题标题】:Detecting a misspelt virtual function检测拼写错误的虚函数
【发布时间】:2010-02-09 21:33:23
【问题描述】:
我不止一次被这个问题所困扰:
class A{
public:
virtual ~A() {}
virtual int longDescriptiveName(){ return 0; }
};
class B: public A{
public:
virtual int longDescriptveName(){ return 1; } // Oops
};
如果函数是纯虚函数,编译器会捕获错误。但如果不是这样,这可能是一个可怕的错误。部分问题是函数名称可能太长了。但我还是想知道,有没有办法早点看到这些bug?
【问题讨论】:
标签:
c++
virtual-functions
misspelling
【解决方案1】:
一种可能性是很少使用的带有实现的纯虚函数:
virtual int longDescriptiveName() = 0
{
return 0;
}
这会强制派生类覆盖它。如果他们只想要这种行为,他们就可以单独调用基类实现。
您还需要确保您的继承层次结构是扁平的,而不是多层,这通常是好的,因为继承足够脆弱,不会堆积在层上。
【解决方案2】:
如果您使用 Microsoft Visual C++ 2005 或更高版本进行编译,则有一个非标准扩展允许您编写:
virtual int longDescriptveName() override { return 1; }
编译器会抱怨。如果您还使用其他编译器进行编译,那么制作 #define 可能很聪明,这样您就可以控制行为。
【解决方案3】:
老死灵的问题,但一种好方法是在开始使用类之前尽早进行测试,无论是正式的单元测试,还是更非正式的测试。换句话说,尽早检查:
A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);
在您编写了 10,000 多行使用您的类的代码之前。