为什么继承会影响异常处理?

iam*_*ind 7 c++ exception-handling

在通过编写测试代码找到这个查询的答案时,我知道私有/受保护的继承会改变从各个类接收异常的方式,这是非常令人惊讶的.为了找到我之前提到的论坛问题的答案,我遇到了类似的问题.

对我来说,使用方法protected继承基类是非常明显的virtual.保持标准,我想知道为什么在虚拟方法调用不是时,C++异常处理是否受到继承的限制?以下片段解释了它:

struct Base { virtual void printError () = 0; };
class Derived : protected Base { void printError () { } };

int main ()
{
try {
  throw new Derived;
}
catch(Base *p) { p->printError(); }  // Ideal; but not invoked
catch(void *p) { ((Base*)p)->printError(); } // Ugly; but only way to invoke
}
Run Code Online (Sandbox Code Playgroud)

编辑: 如果我们将隐私视为一个答案; 公认.但是为什么它只适用于catch()接收基指针,而它不适用于接收基指针的函数?

sho*_*osh 10

privateprotected继承的含义是类或类层次结构之外的任何人都不能知道继承.这与班级外没有人能够了解私人会员的方式相同.
通过其基类捕获派生类向捕获器显示派生类实际上是从基类派生的,并且违反了继承的隐私.


Eri*_*rik 5

protected继承只是意味着Derived它的子类"知道"它也是-a Base.main和catch语句,并不"知道"这个.这是继承特定访问的重点.

虚拟调度不关心这一点-如果你有机会来调用虚函数,那么虚拟调度使用.

在你的样本中,你不能使用a Derived就好像它是Base在其他任何地方main- 所以你不能在catch任何一个中使用它