【问题标题】:Calling protected method in base class via pointer to base class in derived class通过派生类中的基类指针调用基类中的受保护方法
【发布时间】:2011-04-07 09:42:35
【问题描述】:

我想了解为什么当我通过指向基类的指针从派生类调用在基类中声明和实现的受保护方法时,我得到编译错误(C2248),当我通过指向派生类的指针从派生类调用它时实例,编译过程。

我知道这是语言的一部分,但我想了解原因

我的解释是,当我通过派生类中的基类指针调用基类的受保护成员时,编译失败,因为基类的继承可以是受保护的或私有的,但是当我通过指向派生类的指针调用它时派生类没关系,因为它是类的一部分。 对吗?

例如

class Base 

{

protected:

   virtual void func() {}

}

class Derived : public Base

{

public:

   virtual void myMethod()

   {

      Base* pBase = new Base;

      pBase->func();          -> compilation error (C2248)

      Derived* pDerived = new Derived;

      pDerived->func();       -> O.K

    }
}

【问题讨论】:

    标签: visual-c++ inheritance


    【解决方案1】:

    失败的行不可编译,因为您正在访问 Base 的 一个实例 - 只有公共方法才能以这种方式访问​​。如果你在 myMethod() 中这样做:

    Base::func();
    

    它应该可以编译,因为现在我们正在访问this 的继承方法。让pDerived::myMethod() 调用 Derived 构造函数有点奇怪?

    【讨论】:

    • 我无法访问受保护的方法这一事实可以理解,问题是为什么当我调用相同的方法但通过 pDerived 的实例时,它会编译?
    • @David - 这是有效的,因为您在 Derived 的另一个实例中从 Derived::myMethod() 中调用该实例。 Derived 的所有实例对任何其他实例的方法都具有相同的访问权限,就好像它们是自己的一样。如果 myMethod 是一个全局函数,或者是不同类的成员(不是“Derived”),那么这将与从 Derived 到 Base 的调用一样失败。
    猜你喜欢
    • 2023-03-27
    • 2017-10-01
    • 1970-01-01
    • 2016-12-07
    • 2014-02-15
    • 2016-10-06
    • 1970-01-01
    • 2016-07-03
    • 2011-06-08
    相关资源
    最近更新 更多