C++ c++;,受保护的抽象虚拟基纯虚拟私有析构函数

C++ c++;,受保护的抽象虚拟基纯虚拟私有析构函数,c++,C++,我今天找到了这句话,有人能解释一下吗 “如果你认为C++不是太复杂,那么什么是受保护的抽象虚拟基础纯虚私有析构函数,你最后一次需要什么时候?” -Tom Cargill“我相信它是一个私有的纯虚拟析构函数(我认为这一部分是不言自明的),它是抽象基类的一部分,您通过受保护的虚拟继承来使用它 class Base { private: virtual ~Base() = 0; /* A */ }; class Derived : protected virtua

我今天找到了这句话,有人能解释一下吗

<>“如果你认为C++不是太复杂,那么什么是受保护的抽象虚拟基础纯虚私有析构函数,你最后一次需要什么时候?” -Tom Cargill“

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

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

 class Derived : protected virtual Base
 {
    private:
     ~Derived () {.......}    /* B */
 };
从标记B的角度来看,标记A处的行是“受保护的抽象虚拟基纯虚拟私有析构函数”


这三个部分各有其用途。我不知道一个需要所有三个部分的设计模式,但是没有什么可以阻止它们的使用。

< P>不确定原始上下文,但是我猜想是有人声称C++不像java那样的语言那么复杂。汤姆的观点是C++有足够的特性,可以很容易地构造一个非常复杂的结构。p> 基本上,他只是拼凑了一堆单词,然后把它们粘在一起,而没有意识到它们实际上指的是不同的东西,或者通常指的是同一个东西

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 {
};
纯虚拟私有析构函数

也很简单

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 {
};
当然,纯虚拟和抽象是一样的


很明显,这是一个完全不知道自己在说什么的人写的一篇完全夸张的文章。

这些词似乎有道理,但并不真正有意义

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

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

我也不认为:

受保护的抽象虚拟基纯虚拟私有析构函数,上次需要析构函数是什么时候

我认为:

  • 我的课很抽象
  • 析构函数必须是虚拟的
  • 但是我不需要一个实现,所以它是纯的
  • 我将使用受保护的继承

  • Scott Meyers也有他的答案:


    我可以给这个部门贴上“裁员部门”的标签吗?拜托?我不认为是受保护的抽象虚拟基纯虚拟私有析构函数,你上一次需要它是什么时候。我认为1)我的类是抽象的2)析构函数必须是虚拟的。3) 但我不需要实现,所以我将使用受保护的继承。我会对这段引用的历史背景感兴趣。汤姆·卡吉尔因其《异常处理:虚假的安全感》一文而臭名昭著。到处搜索,我发现Tom Cargill在90年代中期搬到了java。我猜想他是(正确或错误地)对C++的幻想破灭了。这句话似乎证实了这一点。任何人都可以确认/确认吗?这是一个编译错误,对吗?因为在虚拟继承中,虚拟基的析构函数必须由派生最多的析构函数调用,但是
    ~derived()
    无法访问
    ~base()
    。(NB:仅仅因为<代码> ~()(<代码)>纯代码并不意味着没有正文。@ BenVoigt:C++是奇怪的。它实际上可以将方法声明为纯(
    =0
    ),并且仍然具有定义和可调用性。这正是像这样的析构函数所发生的事情,因为它总是至少得到自动生成的定义。@BenVoigt是对的,这段代码有一个错误,某种程度上证明了OP引用的观点。。(还缺少
    ~Base
    )的显式正文@NeilKirk:有一个版本可以编译(将
    friend class Derivated;
    添加到
    Base
    的类正文中),但是错误的专家数量(我在本页的答案中计算了四个错误的代码片段/解释)…我在代码中发现了三个问题:1。我不会编译,因为派生函数看不到Base的析构函数。2.即使析构函数不是私有的,它也不会链接,因为析构函数没有主体。它应该在0后面有{}。3. = 0什么都不做,因为派生函数有隐式析构函数,不能强制它有显式析构函数。我认为Tom Cargill对这些词的含义有一个合理的理解。瞧:@janm:他知道这些词的意思,但这并不意味着他在把它们串在一起的时候很小心。值得注意的是,每一个试图让它工作的人(包括著名的Scott Meyers,在BR41N的回答中引用),都产生了非法代码。它可以工作,但是需要一个
    友元类
    声明。纯虚拟并不意味着该类不需要实现,它意味着子类必须提供一个实现(如果该类选择,它也可以这样做)。