我试图运行下面的代码,但得到的错误。
#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这里 衍生的(){} ^ ~~~~~~
我有以下问题
Derived
被公开从类Base
派生,不它使Get()
源性过的成员函数?Get()
成为Derived
的成员函数,那么为什么它不能够调用Derived
的私有构造。我明白 :
Get()
“非静态的虚拟功能”,并覆盖在派生类。我不是在寻找上述解决方案。不过,请让我知道如果这个(这些)是(是)唯一可能的解决方案,以实现这种设计。
类派生公开从类碱的,不它使获得()的派生太的成员函数?
是在这个意义上查找Derived::Get()
的工作,但它调用非常相同的功能,如果你写Base<Derived>::Get()
。
如果[1]是真实的,和get()成为导出的成员函数,那么为什么它不能够调用派生的私有构造。
因为不同的类不能按名称访问私有成员。这是私人是。同样的原因,Derived
无法访问Base
的私有成员。
假设我们有多个类实现为单身,有没有办法,我们可以使用模板类似上述例子的东西做什么呢? (附加题)
这不就是你的榜样是干什么的?
我们可以通过使碱衍生线的朋友可以到代码上面的代码工作。
正确。
我们可以获取()“非静态的虚拟功能”,并覆盖在派生类。
我不认为如此。你不能调用虚函数没有对象。你会被要求打电话Derived
前创建Get
的实例,但Get
应该创造我们的对象。
不过,请让我知道如果这个(这些)是(是)唯一可能的解决方案,以实现这种设计。
我可能会去:l,邀请好友。简单,简洁,你想要做什么。有喜欢有基本保护类型,并限定接收受保护类型的公共构造其他的解决方案,但是这是一个相当漏,我不会建议。
- 类派生公开从类碱的,不它使获得()的派生太的成员函数?
号成员函数碱(静态和非静态的)是基座,派生类的不成员函数的成员函数。但是,调用一个成员函数(取决于可见性)时基(S)的成员函数查找。