当前位置: 首页 > 知识库问答 >
问题:

使纯虚函数的好或坏做法 否 除了 [重复]

李辉
2023-03-14

使纯虚函数不例外是好的做法还是坏做法?我一直认为我们不应该对其实现类施加额外的限制,它们的实现不应该被抛出,因为放置它可能会导致实现中的修改和不必要的 try catch 块以防止异常逃逸。我认为实现应该决定函数是否可以标记为 NO,除了异常规范不应该决定实现吗?

如果我说错了,有人能纠正我吗?

共有2个答案

林龙野
2023-03-14

NOEXCEPT 不是关于实现,而是关于接口。虚函数所代表的抽象运算是从根本上不会失败的吗?然后使虚函数无例外。如果操作在理论上可能失败,即使您编写的任何实现都不能失败,也不要。

史英睿
2023-03-14

< code>noexcept是成员函数规范的一部分,就像它的返回类型、参数列表和< code>const限定符一样。它是为了帮助函数的用户——显然,是以函数的实现者为代价的。

如果您需要为实现者提供更多灵活性,同时为您的用户提供no的函数,请创建一对函数——一个带有的非虚拟公共函数,以及一个没有的受保护虚拟函数。使公共no的函数调用虚拟实现,并处理异常以对其调用者隐藏它们:

class Base {
protected:
    virtual void doSomethingImpl() = 0;
public:
    void doSomething() noexcept {
        try {
            doSomethingImpl();
        } catch(...) {
            // Provide some handling here
        }
    }
};

class Derived : public Base {
    void doSomethingImpl() {
        ... // Implementers have flexibility to throw here
    }
}

 类似资料:
  • 我可以这样写一个类吗: 然后我想这样写派生类: 如果做不到,有没有什么方法可以做到呢?

  • 本文向大家介绍C++中虚函数与纯虚函数的用法,包括了C++中虚函数与纯虚函数的用法的使用技巧和注意事项,需要的朋友参考一下 本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的。具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以使类的接口与实现分离,使

  • 问题内容: 在许多其他语言中,例如。Haskell,很容易多次重复一个值或函数,例如。以获得值的8个副本的列表1: 但是我还没有在Java 8中找到它。Java 8的JDK中是否有这样的功能? 或等效于范围 似乎可以明显替代Java中的冗长语句 有类似的东西 尽管这个示例实际上看起来并不简洁……但是希望它更具可读性。 问题答案: 对于此特定示例,您可以执行以下操作: 如果需要一个不同于1的步骤,则

  • 本文向大家介绍虚函数与纯虚函数之间的区别,包括了虚函数与纯虚函数之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解虚拟和纯虚拟功能之间的区别。 虚函数 它在类中有自己的定义。 基类可以覆盖虚拟函数。 它没有派生类。 声明 纯虚函数 没有定义。 如果一个类至少具有一个虚函数,则可以将其声明为抽象。 派生类必须重写纯虚函数才能使用它。 通过在声明中放置“ = 0”来指定纯虚函数

  • 本文向大家介绍C++ 虚函数和纯虚函数的区别分析,包括了C++ 虚函数和纯虚函数的区别分析的使用技巧和注意事项,需要的朋友参考一下 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函

  • 我正在学习面向对象的C,并有一个关于虚拟/纯虚拟和多级继承的问题。 假设我有这样的简单代码: 我的理解是,除非getWidth被指定为虚拟,否则多态将使用“Base”类的函数。我的意思是r-的最终调用 在这种情况下,我注意到如果我删除Shape中的纯虚拟声明,我们会得到我刚才描述的行为。在基类中有一个纯虚函数会自动使该函数的所有定义都是虚的吗?