【问题标题】:C++ - using parent class attributes [duplicate]C ++ - 使用父类属性[重复]
【发布时间】:2020-01-25 16:11:34
【问题描述】:

我正在编写一个通用的 Vector 类,我希望 Vector3 类从 Vector 继承。 Vector 的数据可以是任意长度,Vector3 的数据长度为 3。所以我想为 Vector3 创建一个不同的构造函数来访问 Vector 的数据和长度。对于这个问题,我简化了代码。

#include <iostream>


template <typename T>
class A {
protected:
    T value;

public:
    A()
    : value(0)
    {};

    A(T value)
    : value(value)
    {};

    ~A ()
    {};

    T get_value()
    {
        return value;
    }
};

template <typename T>
class B : public A<T> {
public:
    B()
    : A<T>(3)
    {};

    T test()
    {
        return value; // error: 'value' was not declared in this scope
    }
};

正如我所说,我想访问子类“B”中的“值”,但是我收到了错误通知

错误:“值”未在此范围内声明

但是根据 c++ 网站 (http://www.cplusplus.com/doc/tutorial/polymorphism/) 我应该能够访问“价值”。

为什么会这样,更重要的是,我该如何解决?

【问题讨论】:

  • 您在 C++ 上下文中错误地使用了术语 attributes
  • 我强烈推荐阅读dependent_name。一开始可能很难阅读,但是当您不仅要寻找快速解决方案,而且要真正了解名称的查找方式时,它确实很有用,尤其是。处理模板时。

标签: c++ class templates attributes polymorphism


【解决方案1】:

这是 C++ 的一个难点。由于您继承自 A&lt;T&gt;not A,默认情况下成员名称不可见。它们被称为非依赖名称,因为它们不依赖于模板参数。我通常会导入我想明确使用的成员:

template <typename T>
class B : public A<T> {
   using A<T>::value;
public:
    B()
    : A<T>(3)
    {};

    T test()
    {
        return value; // error: 'value' was not declared in this scope
    }
};

【讨论】:

  • 好的,但是每次从 A 或 B 继承时我都应该这样做吗?继承应该让生活更早吧?难度不大
  • 是的,每次定义从 A 继承的类时都必须这样做,但在使用它们时不需要这样做,所以这并不是真正的负担。您还可以通过this 指针访问成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多