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
private和protected继承的含义是类或类层次结构之外的任何人都不能知道继承.这与班级外没有人能够了解私人会员的方式相同.
通过其基类捕获派生类向捕获器显示派生类实际上是从基类派生的,并且违反了继承的隐私.
protected继承只是意味着Derived它的子类"知道"它也是-a Base.main和catch语句,并不"知道"这个.这是继承特定访问的重点.
虚拟调度不关心这一点-如果你有机会来调用虚函数,那么虚拟调度时使用.
在你的样本中,你不能使用a Derived就好像它是Base在其他任何地方main- 所以你不能在catch任何一个中使用它