首页 > 解决方案 > 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 时没有问题。只是孙子没有看到它。

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

标签: c++c++11inheritancevisual-c++polymorphism

解决方案


推荐阅读