C ++函数=删除

时间:2015-07-26 10:53:00

标签: c++ class oop inheritance polymorphism

在C ++中(因为我相信C ++ 11),有可能删除"每当程序员不希望编译器自动实现默认构造函数或赋值运算符时,构造函数或赋值运算符。

例如,可以,

class a
{
    const a& operator=(const a& copy_me) = delete;
}

将删除默认赋值运算符。编译器不会为我们实现默认operator=。我们根本无法在我们的代码中使用它,就好像它永远不会存在一样。

考虑一个带有函数,虚函数和纯虚函数的抽象基类(或只是一个基类)。

class example_base
{
    void function()
    {
        return;
    }

    virtual
    void virtual_function() // Do we have to provide an implementation?
    {
        return;
    }

    virtual
    void pure() = 0; // Are there other ways to declare a pure virtual?
                     // Can pure() have an implementation in this class?
}

如果另一个类继承自基类,我们是否允许"删除"基地提供的一些功能? (Q1)

如果是这样,这有什么规则和效果? (Q2)

如果后续类继承自example_inherits并且我们删除了一些成员函数,会发生什么?我们可以再次使用它们吗? (Q3)

class example_inherits : example_base
{
    void function() = delete; // Allowed?

    virtual
    void virtual_function() = delete; // If so why ...

    virtual
    void pure() = delete; // ... or why not?
}

Q3的例子:

class another : example_inherits
{
    // Allowed to use deleted function?
    void function()
    {
        std::cout << "blaa" << std::endl;
    }
}

您可能会想到我所描述的其他排列,例如实现删除方法2次继承更低。 (即,从继承自类的类继承的类中......)

或者虚拟/纯虚拟排序的不同选择......例如:一个类具有虚拟纯,一个类继承自该类并且继承与虚拟相同的函数,然后另一个继承此类的类将删除它或实现它作为常规功能......等等......

对此的一些见解将不胜感激 - 我无法在网上找到详细信息。

2 个答案:

答案 0 :(得分:4)

嗯,你这里有很多问题。他们都可以通过尝试来回答:)

  

我们根本无法在我们的代码中使用它,就好像它从未存在

不完全,因为删除的版本参与了重载解析。例如:

void f(long);
void f(int) = delete;

f(5);

这将无法编译,但是如果你注释掉=delete版本,那么它就会编译。

转到你的问题。

  

pure()可以在这个类中实现吗?

是的,= 0仅表示派生类必须覆盖它。但是你仍然可以在同一个类中为该函数提供一个外联定义。

  

void function() = delete; // Allowed?

是的,这是允许的。派生的function()隐藏了基础function(),因为它不是虚拟的。您当然可以通过指向基类的指针或引用来调用基类function

  

void virtual_function() = delete;

这是不允许的;虚拟功能可能无法删除。

答案 1 :(得分:1)

Matt的答案几乎涵盖了所有内容,但我可以回答有关您无法删除虚拟功能的问题(第3季):

虚拟功能的全部要点是启用subtype polymorphism。一个理智的实现意味着您可以在使用基类型编写的任何合法实现的函数中使用任何合法实现的子类型。这是对Liskov Substitution Principle的重新描述。

这意味着如果您能够删除子类中的虚函数,则该子类在合法实现的函数中使用时会创建未定义的行为。不完全是理想的,我无法想象它会带来任何好处的情况。