2

我不止一次被这个问题所困扰:

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

如果函数是纯虚函数,编译器会捕获错误。但如果不是这样,这可能是一个可怕的错误。部分问题是函数名称可能太长了。但我仍然想知道,有没有办法更早地看到这些错误?

4

3 回答 3

2

一种可能性是很少使用的带有实现的纯虚函数:

virtual int longDescriptiveName() = 0
{
    return 0; 
}

这会强制派生类覆盖它。如果他们只想要这种行为,他们可以单独调用基类实现。

此外,您需要确保您的继承层次结构是平坦的,而不是多层的,这通常是好的,因为继承足够脆弱而不会堆积在层上。

于 2010-02-09T22:08:27.667 回答
1

如果您使用 Microsoft Visual C++ 2005 或更高版本进行编译,则有一个非标准扩展允许您编写:

virtual int longDescriptveName() override { return 1; }

编译器会抱怨。如果您还使用其他编译器进行编译,那么制作 #define 可能很聪明,这样您就可以控制行为。

于 2010-02-09T22:20:15.410 回答
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 多行使用您的类的代码之前。

于 2013-10-26T14:27:11.817 回答