如果基类是公开继承的,那么基类的公共静态函数是否会成为派生类的成员函数
Does public static functions of base class become member functions of derived class if base class is inherited publicly?
我试图运行以下代码,但遇到错误。
#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(){}
^~~~
我有以下问题
- 类
Derived
是从类Base
公开派生的,这不是也使Get()
成为derived的成员函数吗 - 如果[1]为真,并且
Get()
成为Derived
的成员函数,则为什么它不能调用Derived
的私有构造函数 - 假设我们有多个类要实现为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
应该创建我们的对象。
不过,请告诉我这(这些)是否是实现这种设计的唯一可能解决方案。
我可能会选择交友。简单、简洁,随心所欲。还有其他解决方案,比如在基中有一个受保护的类型,并定义一个接收该受保护类型的公共构造函数,但这是非常泄漏的,我不建议这样做。
- class Derived是从class Base公开派生的,这不是也使Get()成为Derived的成员函数吗
否。基的成员函数(静态和非静态)是基的成员功能,而不是派生类的成员功能。但是,在调用成员函数时会查找基的成员函数(取决于可见性)。
- 指向基类派生类的 std::unique_ptr 的指针
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 从模板基类派生是否在派生类声明的点实例化模板
- 使从一个基类派生的类能够使用继承的受保护成员
- C++多态性访问基类派生类字段
- C++派生类的设置属性到从同一基类派生的未知类对象
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 在C++中,如何使用将保存从基类派生的任何对象的类成员
- 如何测试从依赖于外部系统的外部基类派生的类
- 如何从模板基类派生非模板类
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 从具有静态结构的基类派生
- 具有从 c++ 中的非模板基类派生的模板类的事件系统
- C++ 调用从基类派生的覆盖函数
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 如何正向声明从正向声明的模板基类派生的类
- 是否可以从 std::enable_shared_from_this 和抽象基类派生
- 多态性c++,试图访问从抽象基类派生的类的成员函数
- C++多重继承,基类派生自同一类
- 基类派生类访问-如何