我已经被这个问题抓住了不止一次:

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

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

如果该函数是纯虚,编译器捕捉到该错误。但是,如果它不是这可能是一个可怕的错误追查。问题的部分原因是,函数名可能太长。但我仍然不知道,有没有办法提前看到这些错误?

有帮助吗?

解决方案

一种可能是与执行很少使用的纯虚函数:

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

此力导出类来覆盖它。然后,他们可以单独调用基类的实现,如果他们只希望这种行为。

此外,你需要确保你的继承层次是平的,而不是多层,这总体上是好的,因为反正继承是脆弱的地步了,打桩层。

其他提示

如果您使用Microsoft Visual C ++ 2005或更高版本编译,有非标准扩展让你写:

virtual int longDescriptveName() override { return 1; }

和编译器会抱怨。如果你与其他编译器编译同样,它可能是明智的做出的#define这样可以控制的行为。

老necro'd的问题,而是一个好办法是与单元测试来测试初期,无论是正式或非正式的多,你开始使用类之前。换句话说,早期检查的是:

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);

之前的 的你写一个万多行代码使用你的类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top