gpt4 book ai didi

c++ - 如果基类被公开继承,基类的公共(public)静态函数是否成为派生类的成员函数?

转载 作者:行者123 更新时间:2023-11-30 01:35:15 24 4
gpt4 key购买 nike

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

#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;
}

Error :

prog.cpp: In instantiation of ‘static T& Base::Get() [with T = Derived]’:
prog.cpp:18:24: required from here
prog.cpp:7:14: error: ‘Derived::Derived()’ is private within this context
static T t;
^
prog.cpp:14:4: note: declared private here
Derived() {}
^~~~~~~

我有以下问题

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

我明白了:

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

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

最佳答案

class Derived is publically derived from class Base, doesn't it makes Get() a member function of Derived too ?

在查找 Derived::Get() 的意义上是的会工作,但它调用的函数与您编写的 Base<Derived>::Get() 完全相同.

If [1] is true, and Get() becomes a member function of Derived, then why it's not able to call the private constructor of Derived.

因为不同的类不能通过名称访问私有(private)成员。这就是 private 的用途。同样的原因 Derived无法访问 Base 的私有(private)成员.

Assume we have multiple classes to be implemented as Singleton, is there a way we can do it using templates with something similar to the above example? (additional question)

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

We can make the above code work by making base a friend of derived line to the code.

正确。

We can make Get() as "non static virtual function" and override in the derived classes.

我不这么认为。你不能在没有对象的情况下调用该虚函数。您需要创建 Derived 的实例打电话前 Get ,但是Get应该创建我们的对象。

Though, please let me know if this(these) is(are) the only possible solutions to achieve this kind of design.

我可能会去交 friend 。简单,简洁,做你想做的。还有其他解决方案,例如在基类中拥有一个 protected 类型,并定义一个接收该 protected 类型的公共(public)构造函数,但这非常容易泄露,我不会推荐。

关于c++ - 如果基类被公开继承,基类的公共(public)静态函数是否成为派生类的成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54543987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com