我在这样的设置中看到两个问题:
namespace ns1
{
class ParentClass
{
protected:
void callback();
};
}
namespace ns1
{
namespace ns2
{
class ChildClass : public ParentClass
{
public:
void method()
{
registerCallback(&ParentClass::callback);
}
};
}
}
ParentClass *pObj = new ChildClass()
给出了一个错误,即如果没有强制转换,它就无法进行转换。 C ++可以快乐地投降,不是吗?答案 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)
将功能声明为公共。
确保基类具有虚拟析构函数..