c++ - 如何将 const 基类指针转换为派生类

标签 c++

我正在尝试将基类指针转换为派生类对象。我可以使用旧样式进行转换,但不能使用新样式。我发现了一些类似的问题,但没有找到答案。

下面是我的问题的缩小示例。 此行((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/

相关文章:

c++ - 无法使教程中的 wxWidgets 示例正常工作

c++ - 将 SQLite 数据库中的数据保存到变量中

GCC/codeblocks 的 C++ STL 映射编译器问题

c++ - 如何为 std::array 使用默认参数? "array must be initialized with a brace-enclosed initializer"

c++ - C++中的指针如何帮助节省内存?

c++ - 编译时模板限制 C++

c++ - 使用 Intel archiver 命令而不是 ar 的 boost-build(又名 bjam)

c++ - 将 C 字符串转换为 unsigned char 指针

c++ - C++ 中继承的重载规则

c++ - 根据字符串的大小定义数组的大小