比方说,我有下面的类层次结构:Friendness和派生类
class Base
{
protected:
virtual void foo() = 0;
friend class Other;
};
class Derived : public Base
{
protected:
void foo() { /* Some implementation */ };
};
class Other
{
public:
void bar()
{
Derived* a = new Derived();
a->foo(); // Compiler error: foo() is protected within this context
};
};
我想我可以改变它太a->Base::foo()
但由于foo()
是纯虚在Base
类,呼叫将导致调用Derived::foo()
反正。
但是,编译器似乎拒绝a->foo()
。我想这是合乎逻辑的,但我不明白为什么。我错过了什么吗?不能(不应该)它处理这种特殊情况?
谢谢。
实际上,当我指定'a-> Base :: foo()'时,编译器似乎对它有用。你确定吗 ? – ereOn 2010-05-04 17:39:43
你是否一直走到连接步骤?链接器应该抱怨对'Base :: foo'方法的未定义引用。 – 2010-05-04 17:42:15
我没有去连接步骤,你是对的。感谢您选择/更正确的方法。 – ereOn 2010-05-04 17:44:10