我在这样的设置中看到两个问题:
namespace ns1
{
class ParentClass
{
protected:
void callback();
};
}
namespace ns1
{
namespace ns2
{
class ChildClass : public ParentClass
{
public:
void method()
{
registerCallback(&ParentClass::callback);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
ParentClass *pObj = new ChildClass()给出一个错误,它不能在没有强制转换的情况下进行转换.C++可以快乐地投降,不是吗?更改:
registerCallback(&ParentClass::callback);
Run Code Online (Sandbox Code Playgroud)
...至:
registerCallback(&ChildClass::callback);
Run Code Online (Sandbox Code Playgroud)
原因是因为&ParentClass :: callback是一个完全限定的类型名称,不是从ChildClass的上下文解析而是从全局上下文中解析.换句话说,它是同样的问题:
class Thingy
{
protected:
virtual int Foo() {};
};
int main()
{
Thingy t;
t.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)