我正在尝试将基类指针转换为派生类对象。我可以使用旧样式进行转换,但不能使用新样式。我发现了一些类似的问题,但没有找到答案。
下面是我的问题的缩小示例。
此行((Scalar<int>*)base)->get();
给我正确的结果。
此行static_cast<Scalar<int>*>(base)->get();
导致编译器错误:错误:从类型“const Base*”到类型“Scalar*”的 static_cast casts away qualifiers
class Base
{
public:
Base() {};
virtual ~Base() {};
int getID() const { return 1; };
};
template<class T> class Scalar : public Base
{
public:
Scalar() {};
~Scalar() {};
void set(const T value)
{
m_value = value;
}
T get() const { return m_value; }
private:
T m_value;
};
class Access
{
public:
const Base *find() const
{
return &m_scalar;
}
void example()
{
m_scalar.set(25);
const Base *base = find();
int res1 = ((Scalar<int>*)base)->get();
int res2 = static_cast<Scalar<int>*>(base)->get();
std::cout << res1 << std::endl;
std::cout << res2 << std::endl;
}
private:
Scalar<int> m_scalar;
};
最佳答案
当你做的时候
int res1 = ((Scalar<int>*)base)->get();
您执行所谓的 C 风格转换。这是有效的,因为 c 风格的转换不做任何检查并忽略 const
的转换。 .他们只是将源类型转换为目标,而不考虑任何后果。
另一方面static_cast
实际上检查你在做什么,看到你正在尝试转换 base
的常量离开。除 const_cast
外,任何 Actor 都不允许这样做所以你得到一个错误。我们可以在这里使用它来摆脱常量,但这不是必需的。您可以做的只是转换为 const Scalar<int>*
使用
int res2 = static_cast<const Scalar<int>*>(base)->get();
关于c++ - 如何将 const 基类指针转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54367223/