如果基类是公开继承的,那么基类的公共静态函数是否会成为派生类的成员函数

Does public static functions of base class become member functions of derived class if base class is inherited publicly?

本文关键字:基类 派生 函数 成员 是否 继承 如果 静态函数      更新时间:2023-10-16

我试图运行以下代码,但遇到错误。

#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()[withT=Derived]':
prog.cpp:18:24:从这里开始是必需的
prog.cpp:7:14:错误:'Derived::Derived()'在此上下文中是私有的
static T
^
prog.cpp:14:4:注意:此处声明为私有
Derived(){}
^~~~

我有以下问题

  1. Derived是从类Base公开派生的,这不是也使Get()成为derived的成员函数吗
  2. 如果[1]为真,并且Get()成为Derived的成员函数,则为什么它不能调用Derived的私有构造函数
  3. 假设我们有多个类要实现为Singleton有一种方法,我们可以使用类似于上面的例子?(补充问题)

我理解:

  • 我们可以通过使base成为派生的朋友来使上述代码工作代码的第行
  • 我们可以将Get()设置为"非静态虚拟函数",并在派生类

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

class Derived是从基类公开派生的,它不是也使Get()成为Derived的成员函数吗?

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

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

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

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

您的示例不是这样做的吗?

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

正确。

我们可以将Get()作为"非静态虚拟函数",并在派生类中重写。

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

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

我可能会选择交友。简单、简洁,随心所欲。还有其他解决方案,比如在基中有一个受保护的类型,并定义一个接收该受保护类型的公共构造函数,但这是非常泄漏的,我不建议这样做。

  1. class Derived是从class Base公开派生的,这不是也使Get()成为Derived的成员函数吗

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