我不止一次被这个问题抓住了:
class A{
public:
virtual ~A() {}
virtual int longDescriptiveName(){ return 0; }
};
class B: public A{
public:
virtual int longDescriptveName(){ return 1; } // Oops
};
如果函数是纯虚函数,编译器会捕获错误。但如果不是这可能是一个可怕的错误追踪。部分问题是函数名称可能太长。但我仍然想知道,有没有办法早点看到这些错误?
答案 0 :(得分:2)
一种可能性是使用很少的纯虚函数:
virtual int longDescriptiveName() = 0
{
return 0;
}
这会强制派生类来覆盖它。然后,如果他们只想要这种行为,他们就可以单独调用基类实现。
此外,您需要确保您的继承层次结构是扁平的,而不是多层,这通常是好的,因为继承很脆弱而不会在层上堆积。
答案 1 :(得分:1)
如果您使用Microsoft Visual C ++ 2005或更高版本进行编译,则可以使用非标准扩展来编写:
virtual int longDescriptveName() override { return 1; }
编译器会抱怨。如果你也编译其他编译器,它可能很聪明,使#define,所以你可以控制行为。
答案 2 :(得分:0)
古老的问题,但是一个好的方法是在开始使用你的课程之前,要么正式地进行单元测试,要么更正式地进行测试。换句话说,请尽早检查:
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行使用你的类的代码。