c++ - 即使通过引用捕获也会发生切片

标签 c++ exception

我认为我的理解在这里有缺陷,并且想澄清一些事情。的确,我们应该始终遵循黄金法则,按值(value)抛出,按引用捕获。并且,如果我抛出派生对象并按基数捕获,派生的多余部分将被 slice 。但是,当我抛出派生对象并通过引用捕获基础对象时,应该不会发生 slice 。对?

考虑以下代码:

class Base {
  public:
    void print() {
      std::cout << "base print" << std::endl;
    }
};

class Derived : public Base {
  public:
    void d_print() {
      std::cout << "derived print" << std::endl;
    }
};

int main() {
  try {
    Derived d;
    throw d;
  } catch (Base& db) {
    db.print();
    db.d_print();
  }
}

这不会编译。我认为不会有任何 slice ,并且db.d_print()会称为Derived的d_print。我错过了什么?

最佳答案

Slicing happens even after catching by reference



否。 slice 没有发生。

该引用引用所引发的派生对象的基础子对象。它仍然是对base的引用,因此您不能引用派生类的成员。毕竟,不能保证对base的引用是指任何特定派生类的base子对象。

如果要访问派生类型的名称,则应该捕获对派生类型的引用。如果要在捕获特定的子类时具有特定的行为,则可以使用虚拟函数来实现。

关于c++ - 即使通过引用捕获也会发生切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61565181/

相关文章:

c++ - C2653 : 'GUI' : is not a class or namespace

c++ - C++动态加载简介

python - ipython 0.11 异常仅在退出 pdb 后可见

c++ - C++ 中的结构是否类似于枚举或类?

c++ - 每个对象一个 AutoreleasePool?

c++ - 根据类创建时的模板参数更改类 API

c++ - 库使用者是否可以覆盖 C++ 异常处理?

java - 如何从 web 服务中抛出异常?

exception - 如何将本地异常对象传递给类?

c# - 自定义异常类