派生类无法正确查看父类

时间:2010-01-13 18:29:11

标签: c++

我在这样的设置中看到两个问题:

namespace ns1
    {
     class ParentClass
     {
      protected:
       void callback();
     };
    }

    namespace ns1
    {
     namespace ns2
     {
      class ChildClass : public ParentClass
      {
        public:
        void method()
        {
         registerCallback(&ParentClass::callback);
        }
      };
     }
    }
  1. ChildClass :: method()给出了编译错误:“'ns1 :: ParentClass :: callback':无法访问类'ns1 :: ParentClass'中声明的受保护成员
  2. ParentClass *pObj = new ChildClass()给出了一个错误,即如果没有强制转换,它就无法进行转换。 C ++可以快乐地投降,不是吗?

3 个答案:

答案 0 :(得分:6)

变化:

registerCallback(&ParentClass::callback);

...为:

registerCallback(&ChildClass::callback);

原因是& ParentClass :: callback是一个完全限定的类型名,不是从ChildClass的上下文解析而是从全局上下文中解析。换句话说,这是同样的问题:

class Thingy
{
protected:
    virtual int Foo() {};
};


int main() 
{
    Thingy t;
    t.Foo();
    return 0;

}

答案 1 :(得分:3)

派生类只能访问基类的受保护成员,如果该基类实例是 - 并且是通过派生类实例访问的。派生类无权访问其他类型的基类的受保护成员。

编辑:当形成指向成员的指针时,可能会使用基类的受保护成员,但用于作用域成员名称的名称必须是派生类名而不是基类名称这样“无法访问”错误是正确的。

对于第2点,在完整声明using ns1::ParentClass;之后,在外部范围内使用using ns1::ns2::ChildClass;ChildClass,我的语句不会出现任何错误。

答案 2 :(得分:-1)

将功能声明为公共。

确保基类具有虚拟析构函数..