MISRA C++ 2008 规则 5-2-3 咨询:从基础 class 到派生 class 的转换不应在多态类型上执行
MISRA C++ 2008 Rule 5-2-3 Advisory: Casts from a base class to a derived class should not be performed on polymorphic types
在下面的例子中:
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:不应在多态类型上执行从基础 class 到派生 class 的转换。
MISRA 检查器是正确的。你不应该做 static_cast
.
你需要更好地理解多态性。调用函数时
bool test(const A* const p_A)
也可以使用指向派生 class 的指针。并且,通过使用 vtable,将使用正确的函数。所以,不要垂头丧气。
但是,您必须更新您的基地 class。请添加一个纯虚函数
virtual int getBid() const = 0;
在基地class。然后你可以在派生的 class.
中覆盖这个函数
int getBid() const override;
如果其他函数使用指向派生 class 的指针调用您的 bool test(const A* const p_A)
,则将调用正确的函数。
在下面的例子中:
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:不应在多态类型上执行从基础 class 到派生 class 的转换。
MISRA 检查器是正确的。你不应该做 static_cast
.
你需要更好地理解多态性。调用函数时
bool test(const A* const p_A)
也可以使用指向派生 class 的指针。并且,通过使用 vtable,将使用正确的函数。所以,不要垂头丧气。
但是,您必须更新您的基地 class。请添加一个纯虚函数
virtual int getBid() const = 0;
在基地class。然后你可以在派生的 class.
中覆盖这个函数int getBid() const override;
如果其他函数使用指向派生 class 的指针调用您的 bool test(const A* const p_A)
,则将调用正确的函数。