【发布时间】:2013-12-03 20:16:03
【问题描述】:
我有一种情况,我想让一个朋友类调用一个私有方法,然后我想让这个方法成为虚拟方法,所以派生类的方法会被调用——然后我当然意识到友谊不是继承的。所以我们有一种情况,虚拟方法意味着应该调用派生类的方法,但是这个方法是私有的,所以不能调用。哪个优先?
我在 MSVC++ 2008 上对此进行了如下测试
#include<iostream>
class Loner;
class Base
{
friend Loner;
private:
virtual void test(){std::cout << "Base" << std::endl;}
};
class Derived : public Base
{
private:
virtual void test(){std::cout << "Derived" << std::endl;}
};
class Loner
{
public:
void test(Base *base){base->test();}
};
int main()
{
Loner loner;
Derived derived;
loner.test(&derived);
}
输出是:
Derived
因此,虚拟函数似乎“获胜”并授予私有成员访问非朋友的权限 - 几乎是朋友继承!
我的问题是,有人知道这是否是正确的行为吗?当我终于开始升级我的编译器版本时,或者如果我尝试使用 GCC,这种行为可能会改变吗?
干杯
菲尔
【问题讨论】:
-
在 gcc 4.8 c++11 中试过这个,行为是一样的coliru.stacked-crooked.com/a/e3cff63c17122981
标签: c++ inheritance methods virtual friend