访问说明符和右值引用

Access specifiers and rvalue references

本文关键字:引用 说明符 访问      更新时间:2023-10-16

我有下面这段代码,它无法编译(编译器抱怨B::fn不可访问)。

#include <iostream>
using namespace std;
template<typename T>
class B
{
    public:
    void fn(T &&obj)
    {
        cout<<"base versionn";
    }
};
template<typename T>
class A : public B<T>
{
    private:
    using B<T>::fn;
    public:
    void fn(const T &obj)
    {
        cout<<"derived versionn";
    }
};
int main()
{
    A<int *> a;
    a.fn(new int(5));
}

为了使代码工作,我似乎可以

  1. 在派生类中定义一个单独的void fn(T &&obj),或者
  2. 使继承私有,并取消访问说明符

谁能解释一下为什么我现在的代码不起作用,但上面的方法可以?

[UPDATE]:我知道B::fn是私有的。我感到困惑的原因是class A : private B<T>解决了这个问题。

with:

private:
using B<T>::fn;

B<T>::fn可见,但private。用public代替,也可以公开。

如果去掉using B<T>::fn;, B<T>::fnA::fn隐藏,因此main中的调用调用A::fn