【问题标题】:What can possible use of making a class friend and inheriting it also?结交班级朋友并继承它有什么用?
【发布时间】:2020-02-24 23:41:59
【问题描述】:

我正在浏览我当地的一个图书馆并注意到以下内容:

class Derived : public Base
{
        friend class Base; // serves as a factory
    protected:
        pthread_spinlock_t allocLock;
        bool isSafe{ true };

        Derived();
        char *funcA() override;

    public:
        void funcB( bool _in ) override;
        virtual ~Derived();
};

我无法理解 Base 是否已被继承,那么为什么它已成为 friendDerived。另外,评论充当工厂在这里有什么意义?

如果要访问Base函数,::操作符就足够了。

它与设计方法更相关吗?

【问题讨论】:

  • 注释掉那一行,编译,看看有什么问题。
  • 阅读 CRTP。奇怪地重复出现的模板模式。
  • @Unapiedra CRTP 是派生类是基类的模板参数。当基类是派生类的朋友时不是这样。听起来很相似,但实际上非常不同。

标签: c++ c++11 inheritance friend


【解决方案1】:

使基类成为朋友使基类可以访问派生类的私有成员。如果没有看到class Base 的定义,很难说出这是什么原因。该注释似乎表明基类具有创建派生类对象的成员函数。

一般来说,这是一个糟糕的设计。当基类完全知道它的派生类时,这是一件坏事,而当它可以访问派生类的私有成员时,情况就更糟了。依赖关系应该只有一种方式:派生类依赖于基类,而不是相反。换句话说,派生类的变化不应该破坏基类。

如果你需要一个工厂,正确的做法是将创建逻辑放到一个单独的工厂类中,而不是放到基类中。

【讨论】:

  • 理论上,基类也可以是工厂。有时,这很方便。
  • 理论上是的。方便,也许。循环依赖,不好。
  • 基类声明,相关派生类声明后定义。容易。
  • 简单,因为它会编译。但是随后对派生类的更改很可能会破坏基类,这是一种糟糕的情况。单独的工厂类可以更清晰地分离创建逻辑,从而生成更易于维护和测试的代码。
  • 对工厂函数可能构造的类的更改可能需要重新编译甚至修改它。无论是独立的、专用的类还是基类都不会改变任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多