use*_*501 4 c++ oop polymorphism inheritance class
在C ++中(我相信自C ++ 11起),只要程序员不希望编译器自动实现默认的构造函数或赋值运算符,就可以“删除”构造函数或赋值运算符。
举例来说,
class a
{
const a& operator=(const a& copy_me) = delete;
}
Run Code Online (Sandbox Code Playgroud)
这将删除默认的赋值运算符。编译器不会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?
}
Run Code Online (Sandbox Code Playgroud)
如果另一个类继承自基类,是否允许我们“删除”基类中提供的某些功能?(第一季度)
如果是这样,规则和效果是什么?(第二季度)
如果后续类从继承example_inherits而我们删除了一些成员函数,将会发生什么?我们可以再次使用它们吗?(第三季度)
class example_inherits : example_base
{
void function() = delete; // Allowed?
virtual
void virtual_function() = delete; // If so why ...
virtual
void pure() = delete; // ... or why not?
}
Run Code Online (Sandbox Code Playgroud)
第三季度的示例:
class another : example_inherits
{
// Allowed to use deleted function?
void function()
{
std::cout << "blaa" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会想到我所描述的其他排列,例如实现删除的方法要比继承低2阶。(即,在从类继承的类中……)
或选择不同的虚拟/纯虚拟顺序...例如:一个类具有虚拟纯,某个类从该类继承并继承与虚拟相同的功能,然后从该类继承的另一个类将其删除或将其实现为常规功能...等等...
对此有一些见识将不胜感激-我无法在线找到如此详细的信息。
好吧,您在这里有很多问题。他们都可以通过尝试来解决:)
我们根本无法在我们的代码中使用它,就好像它从未出现过一样
不完全是因为删除的版本参与了重载解析。例如:
void f(long);
void f(int) = delete;
f(5);
Run Code Online (Sandbox Code Playgroud)
这将无法编译,但是如果您注释掉该=delete版本,则它将编译。
继续您的问题。
pure()可以在此类中实现吗?
是的,= 0仅表示派生类必须覆盖它。但是您仍然可以在同一类中为该函数提供离线定义。
void function() = delete; // Allowed?
是的,这是允许的。派生对象function()隐藏了base function(),因为它不是虚拟的。当然,您仍然可以function通过指针或对基类的引用来调用基。
void virtual_function() = delete;
这是不允许的;虚拟功能可能无法删除。