避免异常类多重继承自同一非虚基类
7.18 ID_diamondExceptionInheritance
当异常类有多个基类,这些基类又派生自同一非虚基类时,无法通过该非虚基类捕获异常。
本规则是 ID_diamondInheritance 的特化。
示例:
class A {};
class B: public A {};
class C: public A {};
class D: public B, public C {}; // Non-compliant
int main()
{
try {
throw D();
}
catch (A&) { // Cannot catch derived objects
....
}
}
例中基类 A 在派生类 D 中会有多个实例,在这种情况下无法通过基类 A 捕获派生类的对象。
应将 A 设为虚基类:
class A {};
class B: virtual public A {};
class C: virtual public A {};
class D: public B, public C {}; // Compliant
相关
依据
ISO/IEC 14882:2003 10.1(4 5 6)
ISO/IEC 14882:2011 10.1(4 5 6 7)