Один интересный пример, который, по сути, происходит чисто во время выполнения. Это означает, что программе необходимо каким-то образом знать некоторую информацию, полученную из уровня доступа: за [exc.handle] /3.2, обработчик исключения соответствует объекту исключения, еслиобработчик принимает однозначный и публичный базовый класс типа класса объекта исключения.
#include <iostream>
class Base {};
void test(void (*thrower)()) {
try {
thrower();
} catch (Base&) {
std::cout << "Caught a Base." << std::endl;
} catch (...) {
std::cout << "Not a Base?" << std::endl;
}
}
class D1 : public Base {};
class D2 : private Base {};
int main() {
std::cout << "Test D1" << std::endl;
test([]() { throw D1{}; });
std::cout << "Test D2" << std::endl;
test([]() { throw D2{}; });
}
Это печатает:
Test D1
Caught a Base.
Test D2
Not a Base?
... даже если толькоразница между D1
и D2
заключается в изменении ключевого слова спецификатора доступа.