【问题标题】:Does public static functions of base class become member functions of derived class if base class is inherited publicly?如果基类是公开继承的,基类的公共静态函数是否会成为派生类的成员函数?
【发布时间】:2019-02-05 22:24:09
【问题描述】:

我正在尝试运行以下代码,但出现错误。

#include <iostream>
template <typename T>
class Base {
  public :
    static T& Get() {
      static T t;
      return t;
    }
};    
class Derived : public Base<Derived> {
  private :
    Derived() {}
    // friend Base<Derived>;  //un-commenting this will make code work.
};                            

int main() {
  Derived& d = Derived::Get();
  return 0;
}

错误:

prog.cpp:在“静态 T& Base::Get() [with T = Derived]”的实例化中:
prog.cpp:18:24: 从这里需要
prog.cpp:7:14:错误:“Derived::Derived()”在此上下文中是私有的
静态 T t;
^
prog.cpp:14:4: 注意:这里声明为私有
派生(){}
^~~~~~~

我有以下问题

  1. Derived 类公开派生自Base 类,难道Get() 也是Derived 的成员函数吗?
  2. 如果 [1] 为真,并且Get() 成为Derived 的成员函数,则 为什么不能调用Derived的私有构造函数。
  3. 假设我们有多个类要实现为单例,是 有一种方法可以使用类似的模板来做到这一点 上面的例子? (附加问题)

我明白了:

  • 我们可以通过让 base 成为派生的朋友来使上面的代码工作 代码行。
  • 我们可以将Get()设为“非静态虚函数”并覆盖 派生类。

我不是在寻找上述解决方案。不过,如果这(这些)是实现这种设计的唯一可能解决方案,请告诉我。

【问题讨论】:

    标签: c++ templates inheritance compiler-errors singleton


    【解决方案1】:

    类 Derived 是从类 Base 公开派生的,是不是也让 Get() 成为 Derived 的成员函数?

    是的,因为查找 Derived::Get() 会起作用,但它调用的函数与您编写 Base&lt;Derived&gt;::Get() 的函数完全相同。

    如果 [1] 为真,Get() 成为 Derived 的成员函数,那为什么不能调用 Derived 的私有构造函数。

    因为不同的类不能通过名字访问私有成员。这就是私人的用途。与Derived 无法访问Base 的私有成员的原因相同。

    假设我们有多个类要实现为单例,有没有一种方法可以使用类似于上述示例的模板来实现? (附加问题)

    你的例子不就是这样吗?

    我们可以通过使base成为代码的派生行的朋友来使上述代码工作。

    正确。

    我们可以将 Get() 设为“非静态虚函数”并在派生类中覆盖。

    我不这么认为。没有对象就不能调用该虚函数。在调用Get 之前,您需要创建Derived 的实例,但Get 应该创建我们的对象。

    不过,如果这(这些)是实现这种设计的唯一可能解决方案,请告诉我。

    我可能会去交朋友。简单,简洁,做你想做的事。还有其他解决方案,例如在基类中使用受保护类型,并定义一个接收该受保护类型的公共构造函数,但这很容易泄漏,我不会推荐。

    【讨论】:

      【解决方案2】:
      1. 类 Derived 是从类 Base 公开派生的,是不是也让 Get() 成为 Derived 的成员函数?

      没有。基类的成员函数(静态和非静态)是基类的成员函数,而不是派生类的成员函数。但是,在调用成员函数时会查找 base(s) 的成员函数(取决于可见性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        • 2010-10-05
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        相关资源
        最近更新 更多