难道基类的公共静态功能成为派生类的成员函数,如果基类继承公开?

问题描述 投票:1回答:2

我试图运行下面的代码,但得到的错误。

#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&基地::获取()[用T =派生]”: prog.cpp:18:24:从这里需要 prog.cpp:7:14:错误:衍生::派生()'是在这一范围内的私人 静态T T [; ^ prog.cpp:14:4:注:声明为private这里 衍生的(){} ^ ~~~~~~

我有以下问题

  1. Derived被公开从类Base派生,不它使Get()源性过的成员函数?
  2. 如果[1]是真实的,Get()成为Derived的成员函数,那么为什么它不能够调用Derived的私有构造。
  3. 假设我们有多个类实现为单身,有没有办法,我们可以使用模板类似上述例子的东西做什么呢? (附加题)

我明白 :

  • 我们可以通过使碱衍生线的朋友可以到代码上面的代码工作。
  • 我们可以Get()“非静态的虚拟功能”,并覆盖在派生类。

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

c++ templates inheritance compiler-errors singleton
2个回答
2
投票

类派生公开从类碱的,不它使获得()的派生太的成员函数?

是在这个意义上查找Derived::Get()的工作,但它调用非常相同的功能,如果你写Base<Derived>::Get()

如果[1]是真实的,和get()成为导出的成员函数,那么为什么它不能够调用派生的私有构造。

因为不同的类不能按名称访问私有成员。这是私人是。同样的原因,Derived无法访问Base的私有成员。

假设我们有多个类实现为单身,有没有办法,我们可以使用模板类似上述例子的东西做什么呢? (附加题)

这不就是你的榜样是干什么的?

我们可以通过使碱衍生线的朋友可以到代码上面的代码工作。

正确。

我们可以获取()“非静态的虚拟功能”,并覆盖在派生类。

我不认为如此。你不能调用虚函数没有对象。你会被要求打电话Derived前创建Get的实例,但Get应该创造我们的对象。

不过,请让我知道如果这个(这些)是(是)唯一可能的解决方案,以实现这种设计。

我可能会去:l,邀请好友。简单,简洁,你想要做什么。有喜欢有基本保护类型,并限定接收受保护类型的公共构造其他的解决方案,但是这是一个相当漏,我不会建议。


2
投票
  1. 类派生公开从类碱的,不它使获得()的派生太的成员函数?

号成员函数碱(静态和非静态的)是基座,派生类的不成员函数的成员函数。但是,调用一个成员函数(取决于可见性)时基(S)的成员函数查找。

© www.soinside.com 2019 - 2024. All rights reserved.