无法转换此指针

时间:2011-02-05 14:36:56

标签: c++ class inheritance

我有一个类Foo,看起来像这样

class Foo
{
public:
    void set_bar(int val)
    {
        _bar = val;
    }

protected:
    int _bar;
};

由类Baz继承,声明如下:

class Baz
    : public Foo
{
public:
    void set_baz(int val)
    {
        _baz = val;
    }

protected:
    int _baz;
};

然后我有一个Factory类,其中包含Baz类型的成员变量。

class Factory
{
protected:
    Baz _baz;
public:
    const Baz& get_baz() const 
    {
        return _baz;
    }
};

如果我这样使用Factory

Factory f;
f.get_baz().set_bar(1);

抛出此error C2662: 'Foo::set_bar' : cannot convert 'this' pointer from 'const Baz' to 'Foo &'

4 个答案:

答案 0 :(得分:1)

get_baz返回的对象是常量,您无法修改其内容。

答案 1 :(得分:1)

您需要提供一个非const版本的Factory :: get_baz,它返回对Baz的非const引用:

class Factory
{
protected:
    Baz _baz;
public:
    const Baz& get_baz() const 
    {
        return _baz;
    }

    Baz& get_baz()
    {
        return _baz;
    }
};

使用const Factory时,将调用get_baz的const版本,否则将调用get_baz的非const版本。

您还应该避免在名称中使用前导下划线。请参阅What are the rules about using an underscore in a C++ identifier?

答案 2 :(得分:0)

调用get_baz后,你得到常量对象,而常量对象只能调用常量函数。

答案 3 :(得分:0)

如果向对象返回非const引用,则只能更改该值。

如果您返回非const引用,为什么不将该成员公开?你会得到同样的效果......