Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将常量基类指针强制转换到派生类中_C++ - Fatal编程技术网

C++ 如何将常量基类指针强制转换到派生类中

C++ 如何将常量基类指针强制转换到派生类中,c++,C++,我试图将基类指针强制转换到派生类对象中。我可以用旧的风格,但不能用新的风格。我发现了一些类似的问题,但没有找到答案 下面是我的问题的一个缩小的例子。 此行((标量*)基)->get()为我提供了正确的结果。 此行static_cast(base)->get()导致编译器错误:错误:从“const Base*”类型到“Scalar*”类型的静态转换会丢弃限定符 class Base { public: Base() {}; virtual ~Base() {}; i

我试图将基类指针强制转换到派生类对象中。我可以用旧的风格,但不能用新的风格。我发现了一些类似的问题,但没有找到答案

下面是我的问题的一个缩小的例子。 此行
((标量*)基)->get()为我提供了正确的结果。
此行
static_cast(base)->get()导致编译器错误:错误:从“const Base*”类型到“Scalar*”类型的静态转换会丢弃限定符

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;
};
类基
{
公众:
Base(){};
虚~Base(){};
int getID()常量{return 1;};
};
模板类标量:公共基
{
公众:
标量(){};
~Scalar(){};
无效集(常数T值)
{
m_值=值;
}
T get()常量{返回m_值;}
私人:
T m_值;
};
类访问
{
公众:
常量Base*find()常量
{
返回&m_标量;
}
void示例()
{
m_标量集(25);
常量Base*Base=find();
int res1=((标量*)基)->get();
int res2=static_cast(base)->get();

std::cout您错过了const

static_cast<Scalar<int> const*>(base)->get();
static_cast(base)->get();

<>我强烈建议避免在C++代码中使用C样式的转换,因为在参数类型改变时,强制转换的确切语义可能会悄然改变。

< p>编译器错误几乎会将其钉住,不能丢弃<代码> const <代码> ->从<代码>()返回的内容。
带有一个
静态\u cast
。因此:

static_cast<const Scalar<int> *>(base)->get();
static_cast(base)->get();
请记住,丢弃常量通常是一种代码气味,请参见。

int res1 = ((Scalar<int>*)base)->get();

抛开
const
在99.999%的情况下都是一个非常糟糕的主意。正因为如此,你需要使用一个特殊的构造:。作为一个一般提示:如果你觉得有必要使用C风格的cast,那么你很可能是做错了什么。既然如此,为什么不将其转换为
const
指针?如
constScalar*
?是的,这在我的示例中是有效的,但我自己也在想,因为在我的原始项目中使用此解决方案时,我会遇到以下错误:将“const xxxx”作为“this”参数传递会丢弃限定符[-fppermissive]。示例和现实世界之间一定存在差异。@Inok听起来像是您试图调用的函数没有标记为
const
,这与示例中的
get
不同。这会导致错误。如果是这种情况,您需要使该函数
const
(首选)或丢弃constness(非首选)。丢弃常量的问题是,如果对象真的是
常量
,那么修改它将是未定义的行为。你完全正确。在我的实际项目中,我称之为set not get。在我的示例中,我会得到相同的错误。但我不能在setter中使用常量。正确的解决方案是什么?@Inok To me The right sol解决方法是首先将
base
作为一个非常量指针。就像在您的示例中通过
find
,直接使用
m_scalar
。如果您无法查看是否可以在非常量版本中获取指针。如果您无法做到这一点,那么您可能必须放弃常量,但我强烈建议你没有。你可以做的是用一个完全模仿你真正想做的事情的新问题发布一个新问题,并询问是否有一种方法可以在不使用常量的情况下获取指针。这听起来可能很戏剧性,但
const\u cast
非常危险。是的,重点是find()不是我描述的那么简单,但我会想,如果我找到一个方法。谢谢!
int res2 = static_cast<const Scalar<int>*>(base)->get();