gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:17:09 24 4
gpt4 key购买 nike

我认为我的理解在这里有缺陷,并且想澄清一些事情。的确,我们应该始终遵循黄金法则,按值(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com