【发布时间】:2017-01-29 09:58:19
【问题描述】:
class Base
{
protected:
void func1();
};
class Derived : public Base
{
friend class Third;
};
class Third
{
void foo()
{
Derive d;
d.func1();
}
};
我可以在 VC14 (Visual Studio 2015) 中编译代码而不会出现错误 但从 VC12 (Visual Studio 2013) 得到错误
cannot access protected member declared in class 'Base'
谁是对的? 这种与继承的友谊的正确性是什么?
来自MSDN https://msdn.microsoft.com/en-us/library/465sdshe.aspx 或http://en.cppreference.com/w/cpp/language/friend 看来友情是不可传递的,不能被继承。但是我认为这个代码示例并非如此。
但是为什么 VC14 不会给我一个错误呢?
如果 VC14 是正确的,我该如何“修改”代码以使 VC12 也可以这样做? 在 Derived 类中再次定义 protected func1()?
【问题讨论】:
-
我怀疑你可以在任何编译器上编译该代码:它缺少一些分号。
-
在 GCC ideone.com/Zue7WL 上没有错误。
-
好问题。传递性和继承不适用,因为它是派生类将 Third 声明为友元。该代码被 clang 和 gcc 接受。
标签: c++ visual-studio inheritance friend