我想理解为什么当我调用在基类中声明和实现的protected方法时,从派生类通过指向基类的指针我得到编译错误(C2248),当我从派生类通过指向派生类调用它时实例,编译传递。
我知道它是语言的一部分,但我想理解为什么
我的解释是,当我通过指向派生类中的基类的指针调用基类的受保护成员时,编译失败,因为基类的继承可以受到保护或私有但是当我通过指向派生类的指针调用它时派生类它可以,因为它是类的一部分。 是吗?
e.g。
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
}
}
答案 0 :(得分:3)
失败的行无法编译,因为您正在访问Base的实例 - 只能通过这种方式访问公共方法。如果你在myMethod()中执行此操作:
Base::func();
它应该编译,因为现在我们正在访问this
的继承方法。让pDerived::myMethod()
调用Derived构造函数会有点奇怪吗?