【问题标题】:c++, protected abstract virtual base pure virtual private destructorc++,受保护的抽象虚拟基纯虚拟私有析构函数
【发布时间】:2023-03-23 16:03:02
【问题描述】:

所以,我今天找到了这句话,谁能解释一下?

“如果您认为 C++ 并不过分复杂,那么什么是受保护的抽象虚拟基纯虚拟私有析构函数,您最后一次需要它是什么时候? ——汤姆·嘉吉”

【问题讨论】:

  • 我可以标记这个“冗余部门”吗?请问?
  • 我没想到protected abstract virtual base pure virtual private destructor and when was the last time you needed one。我认为 1)我的类是抽象的 2)析构函数必须是虚拟的。 3)但我不需要实现,所以它是纯粹的 3)我将使用受保护的继承。
  • 我会对这句话的历史背景感兴趣。 Tom Cargill 因其“异常处理:一种虚假的安全感”一文而臭名昭著。谷歌搜索,我发现 Tom Cargill 在九十年代中期搬到了 Java。我的猜测是他(无论对错)对 C++ 的幻想破灭了。而这句话往往证实了这一点。任何人都可以确认/确认吗?

标签: c++


【解决方案1】:

我相信它是一个 私有纯虚拟析构函数(我认为这部分是不言自明的),它是您使用过的抽象基类的一部分通过受保护的虚拟继承。 .

 class Base
 {
    private:
        virtual ~Base() = 0;   /* A */
 };

 class Derived : protected virtual Base
 {
    private:
     ~Derived () {.......}    /* B */
 };

从标签B的角度来看,标签A处的那一行是“受保护的抽象虚基纯虚私有析构函数”,

这三个部分中的每一个都有各自的用途。我不知道需要上述所有三个部分的设计模式,但没有什么能阻止它们一起使用。

【讨论】:

  • 这是一个编译错误,对吧?因为在虚继承中,虚基的析构函数必须由派生最多的析构函数调用,但~Derived() 无权访问~Base()。 (注意:~Base() 纯虚拟并不意味着没有实体。)
  • @BenVoigt:C++ 很奇怪。它实际上可以将方法声明为纯 (= 0) 并且仍然具有定义和可调用性。这正是像这样的析构函数会发生的事情,因为它总是至少获得自动生成的定义。
  • @BenVoigt 是对的,这段代码有一个错误,证明了 OP 引用的意思..(也缺少~Base 的明确正文)
  • @NeilKirk:有一个可以编译的版本(将friend class Derived; 添加到Base 的类主体中)但是专家数量错误(我数了四个错误代码sn-ps/此页面上的答案中的解释)...
  • 我在该代码中看到 3 个问题: 1. 我不会编译,因为 Derived 没有看到 Base 的析构函数。 2. 即使析构函数不是私有的,它也不会链接,因为析构函数没有主体。它应该在 0. 3. = 0 之后有 {}
【解决方案2】:

不确定最初的上下文,但我猜有人会声称 C++ 不像 Java 这样的语言那么复杂。 Tom 的观点是 C++ 具有足够的特性,您可以轻松地构建非常复杂的构造。

【讨论】:

    【解决方案3】:

    Scott Meyers 也有他的答案:

    https://youtu.be/ltCgzYcpFUI?t=7m25s

    【讨论】:

      【解决方案4】:

      这些话似乎有道理,但不是真的。

      另外,将两个不同的事物属性串在一起以试图使事物过于复杂,这表明作者只是试图混淆人们,试图提出一个并不存在的观点。

      我们应该注意,每种情况都是独一无二的,您可以根据情况构建类层次结构和析构函数。将这种语言称为过于复杂,因为它提供了便利是愚蠢的。就像说私有继承有什么意义。是的,通常你不会使用它,但有时会很高兴拥有它。

      我也没有想到:

      受保护的抽象虚拟基纯虚拟私有析构函数以及您最后一次需要一个析构函数是什么时候

      我认为:

      1. 我的课是抽象的
      2. 析构函数必须是虚拟的。
      3. 但我不需要实现,所以它是纯粹的
      4. 我将使用受保护的继承

      【讨论】:

      • 纯虚拟并不意味着类不需要实现,它意味着子类必须提供实现(如果它选择,类也可以这样做)。跨度>
      【解决方案5】:

      基本上,他只是把一堆单词拼凑在一起,却没有意识到它们实际上指的是不同的东西,或者通常是同一个东西。

      protected abstract virtual base
      

      很简单。

      class Base { // BASE
          virtual something() = 0; // ABSTRACT
      };
      class Derived : protected virtual Base { // PROTECTED VIRTUAL
      };
      

      纯虚拟私有析构函数

      也很简单。

      class Base { // BASE
      private:
          virtual ~Base() = 0; // pure virtual, private, destructor
      };
      class Derived : Base {
      };
      

      当然,纯虚和抽象是一样的。

      这是一个完全不知道自己在说什么的人写的非常完整和完全的夸张。

      【讨论】:

      • 我认为 Tom Cargill 对这些词的含义有一个合理的理解。见:amazon.com/C-Programming-Style-Tom-Cargill/dp/0201563657
      • @janm:他知道这些词的意思,但这并不意味着他在将它们串在一起时很小心。值得注意的是,所有试图让这件事发挥作用的人(包括在 BR41N 的回答中引用的相当著名的 Scott Meyers)都产生了非法代码。它可以工作,但需要friend class 声明。
      猜你喜欢
      • 2016-01-22
      • 2019-04-20
      • 2011-03-21
      • 2012-11-23
      • 2020-03-06
      • 2013-11-03
      • 2019-12-08
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多