【发布时间】:2013-06-07 12:13:30
【问题描述】:
我在理解如何管理虚拟方法的访问权限时遇到了一些麻烦。我做了两个小代码示例,但我无法理解它是如何工作的。
代码示例 1
第一个代码包含 3 个类:一个母类Foo 和两个派生类。 Baz 类看起来有点像 Composite。有一个虚方法,但它是受保护的。
class Foo
{
protected:
virtual void doIt() = 0;
};
class Bar : public Foo
{
protected:
void doIt()
{}
};
class Baz : public Foo
{
protected:
void doIt()
{
M_foo->doIt(); // Error here
}
private:
Foo* M_foo;
};
在尝试编译 (Visual C++ 2010) 时,我收到一个错误:我无法在派生类中从指向 Foo 的指针调用 doIt。所以,我的理解是“我不能调用这个方法,因为它实际上可以调用另一个我无权调用的方法(例如 Bar 的那个)”。
代码示例 2
我决定稍微改变一下代码的设计并设计一个函数而不是虚拟方法。但是,要访问受保护的方法,我需要与我的函数添加友谊。
class Foo
{
friend void doItPlease( Foo* foo);
protected:
virtual Foo* getChild() = 0;
};
class Bar : public Foo
{
protected:
Foo* getChild()
{ return 0;}
};
class Baz : public Foo
{
protected:
Foo* getChild()
{
return M_foo;
}
private:
Foo* M_foo;
};
void doItPlease( Foo* foo)
{
Foo* myFoo( foo->getChild() );
};
这段代码编译得很好。问题是我不明白为什么:我只将基类声明为friend,而不是子类,并且没有继承友谊。但是现在,当我从函数中调用 getChild 时,就好像我会调用一个我无权使用的方法(例如 Baz 中的那个)。
谁能解释一下与虚拟方法相关的权利是如何管理的?
【问题讨论】:
标签: c++ inheritance virtual friend