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

时间:2021-03-26 14:03:42

标签: c++ c++11 inheritance visual-c++ polymorphism

以下 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 时没有问题。只是孙子没有看到它。

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

0 个答案:

没有答案