这。与基地。对于继承的受保护的非虚拟方法?

Posted

技术标签:

【中文标题】这。与基地。对于继承的受保护的非虚拟方法?【英文标题】:this. vs base. for inherited protected non-virtual methods? 【发布时间】:2013-04-26 06:32:50 【问题描述】:

在我的子类中,我应该将继承的受保护非虚拟方法称为this.Method() 还是base.Method()

使用this 可以让我轻松地使用同名的新方法隐藏该方法。只有在确定只需要调用基类的实现时,才应该显式地指定 base 方法调用?

【问题讨论】:

您应该在调用时始终调用 this.Method() 并从派生类中已实现的重写方法中调用 base::Method()。这样,将来当您覆盖某些内容时,您不必四处走动 base.Method(); 它不是虚拟方法,不能被覆盖。非虚方法只能隐藏。 为什么不直接将其称为Method()?如果this 用自己的Method() 隐藏它,那么它将被调用。如果没有,base.Method() 将被调用。这被选为默认行为;可能有充分的理由。 ^_^ 因为它是一个非虚拟方法,所以不涉及功能多态性。为了清楚起见,我会选择 base.Method。 @Kurian - 对我来说很奇怪,明确调用 this.Method() 可读性较差。但如果 StyleCop 需要它,我会选择 this.Method(),因为这是标准行为。 【参考方案1】:

如果你要在你的子类中添加一个名为Method 的成员并且仍然想调用继承的方法,你应该使用base.Method()。 在更多派生类中添加名为Method 的成员不会改变this.Method() 调用的含义。

【讨论】:

【参考方案2】:

始终使用this.Method() 调用。

如果您隐藏该方法,您可能希望调用新方法而不是基类中的方法。另一方面,如果您将基类的方法设为虚拟,您可能希望代码以多态方式调用 if。

很难预测未来,但这些情况似乎更有可能发生。

【讨论】:

以上是关于这。与基地。对于继承的受保护的非虚拟方法?的主要内容,如果未能解决你的问题,请参考以下文章

C ++虚拟+受保护?

访问控制与继承

C ++中的非对称虚拟继承菱形

为啥不能将继承的受保护构造函数公开?

策略继承和不可访问的受保护成员

为啥继承的受保护运算符=()具有公共访问权限