微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c++ 孙子看不到抽象祖父母的数据

如何解决c++ 孙子看不到抽象祖父母的数据

以下 C++ 代码无法编译:

class Val
{
protected:
    int n;
public:
    Val() : n(0) {}
    Val(int nn) : n(nn) {}

    virtual int blah() const = 0;
};

template <class T>
class subVal : public Val
{
public:
    subVal() : Val() {}

    int blah() const { return n; }
};

template <class T>
class subsubVal : public subVal<T>
{
public:
    subsubVal() : subVal<T>() {}

    int blah() const { return n; } // this is the "faulty" line

    int blahblah() const { return n; }
};



subsubVal<int> ssv;   // declare an instance,to confirm that it can be done

编译器 (VisualStudio) 显示“C2065 'n' 未声明标识符”。

如果我用

替换标记为“错误”的行
int blah() const { return Val::n; } // replacement line

然后就可以编译了。

失败,我认为与这里的 Val 是一个抽象类有关,因为另一种获得成功编译的方法是注释掉 Val 类中 blah() 的纯虚函数声明。 请注意,孙方法 blahblah() 不会生成编译器错误。我认为这也与模板有关,因为如果删除模板,代码就会编译(但当然我想在整个项目中模板;这只是一个片段来说明这一点)。还要注意,孩子在看到父母中的数据值 n 时没有问题。只是孙子没有看到它。

我首先希望得到一个澄清逻辑的答案(因为我没有编译的代码对我来说看起来合乎逻辑),然后找到一个比在代码中粘贴大量可怕的“类名::”标识符更好的解决方案孙子。 (在实践中,这些标识符的名称会更长,并且会大大降低代码的自然性和可读性)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。