MISRA C++ 2008 规则 5-2-3 建议:不应在多态类型上执行从基类到派生类的强制转换

问题描述

在下面的例子中:

class A
{
public:
    A();
    virtual ~A();
    int getID() const;

private:
    int m_ID;
};

Class B : public A
{
public:
    B();
    virtual ~B();
    int getBid() const;

private:
    int m_Bid;
};

bool test(const A* const p_A)
{
    if(5U == static_cast<const B* const>(p_A)->getBid())
    {
         ....
    }
    else
    {
         ...
    }
}

我收到了 MISRA 5-2-3 报告,但我现在不知道如何解决。

MISRA 5-2-3:不应在多态类型上执行从基类到派生类的转换。

解决方法

MISRA 检查器是对的。您不应该执行 static_cast

你需要更好地理解多态。调用您的函数时

bool test(const A* const p_A)

也可以使用指向派生类的指针。并且,通过使用 vtable,将使用正确的函数。所以,不要沮丧。

但是,您必须更新您的基类。请添加纯虚函数

virtual int getBid() const = 0; 

在基类中。然后你可以在你的派生类中重写这个函数。

int getBid() const override;

如果然后其他函数使用指向派生类的指针调用您的 bool test(const A* const p_A),则将调用正确的函数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...