CodeQL 文档

无规范的多重继承

ID: cpp/undisciplined-multiple-inheritance
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - maintainability
   - readability
   - external/jsf
Query suites:
   - cpp-security-and-quality.qls

单击以在 CodeQL 代码库中查看查询

此规则确保类符合受限形式的多重继承。受限形式允许从任意数量的*接口*(即仅包含纯虚函数和必要数据的类)、任意数量的私有实现以及仅一个受保护的实现继承。仅允许一个受保护的基类可确保该类仅允许覆盖该基类中的函数(并且不会意外覆盖其他基类中的函数)。允许多个私有实现允许重用(但不能覆盖)来自多个类的函数。

这种受限的继承形式几乎与 Java 相同,在 Java 中,一个类只能扩展(公共/受保护派生)一个类,但可以实现(公共派生)多个接口(纯虚类),并通过私下派生自实现类来重用成员,从而提供类似于混入的行为 [Bracha 和 Cook]。这强制实施了一个可预测且易于理解的公共类层次结构,同时为非公共实现提供了灵活性和代码重用机会。

指示的类违反了受限形式的多重继承。

建议

更改类以符合受限形式的多重继承。

示例

//correct:
//  only one protected base,
//  multiple interfaces ("pure virtual" classes), and
//  multiple private implementations
class C : protected Superclass,
          public InterfaceA, public InterfaceB,
          private ImplementationA, private ImplementationB
{
    //implementation
};

//wrong: multiple protected bases
class D : protected Superclass1, protected Superclass2,
          public Interface, private Implementation
{
    //implementation
};

参考

  • AV 规则 88,*联合攻击战斗机飞行器 C++ 编码标准*。洛克希德·马丁公司,2005 年。

  • G. Bracha 和 W. Cook。*基于混入的继承*。OOPSLA/ECOOP '90:面向对象编程系统、语言和应用程序的欧洲会议论文集,第 303-311 页。1990 年。

  • S. Meyers。*Effective C++ 第三版*。第 192-198 页。Addison-Wesley Professional,2005 年。

  • ©GitHub 公司
  • 条款
  • 隐私