C++ 访问控制和静态成员
我阅读了有关静态成员函数的acces说明符的内容,最后得到了MSDN中的这个示例:我认为它有一个错误C++ 访问控制和静态成员,c++,C++,我阅读了有关静态成员函数的acces说明符的内容,最后得到了MSDN中的这个示例:我认为它有一个错误 // access_control.cpp class Base { public: int Print(); // Nonstatic member. static int CountOf(); // Static member. }; class Derived1 : private Base { };
// access_control.cpp
class Base
{
public:
int Print(); // Nonstatic member.
static int CountOf(); // Static member.
};
class Derived1 : private Base
{
};
class Derived2 : public Derived1
{
int ShowCount(); // Nonstatic member.
};
int Derived2::ShowCount()
{
// Call static member function CountOf explicitly.
int cCount = Base::CountOf(); // OK.
// Call static member function CountOf using pointer.
cCount = this->CountOf(); // C2247. Conversion of
// Derived2 * to Base * not
// permitted.
return cCount;
}
所以它说这行没问题,但它不是:
int cCount = Base::CountOf(); // OK.
这是错误消息:
error C2247: 'Base::CountOf' not accessible because 'Derived1' uses 'private' to inherit from 'Base'
那么这个错误真的存在吗?或者它与编译时必须添加的某个选项有关吗
Thx在C++17标准部分[class.access.base]/3中有一个与您的代码类似的示例: 私有基类的成员可能无法作为继承的成员名访问,但可以直接访问。由于指针转换(7.11)和显式转换(8.4)的规则,如果使用隐式转换,则从指向派生类的指针到指向不可访问基类的指针的转换可能格式错误,但如果使用显式转换,则格式正确。比如说,
您的代码与此不同之处在于您执行
Base::CountOf()
。这仍然是一个错误,因为访问是在Derived2
的上下文中检查的,并且对基类的私有成员没有访问权限
但是::Base::CountOf()
是正确的,因为这样在全局命名空间中检查了访问权限
您可以用与标准示例类似的方式修复示例的第二部分:
(::Base*)this)->CountOf()
在C++17标准部分[class.access.Base]/3中,有一个与您的代码类似的示例:
私有基类的成员可能无法作为继承的成员名访问,但可以直接访问。由于指针转换(7.11)和显式转换(8.4)的规则,如果使用隐式转换,则从指向派生类的指针到指向不可访问基类的指针的转换可能格式错误,但如果使用显式转换,则格式正确。比如说,
您的代码与此不同之处在于您执行
Base::CountOf()
。这仍然是一个错误,因为访问是在Derived2
的上下文中检查的,并且对基类的私有成员没有访问权限
但是::Base::CountOf()
是正确的,因为这样在全局命名空间中检查了访问权限
您可以用与标准示例类似的方式修复示例的第二部分:
(::Base*)this)->CountOf()
是的,错误确实存在。CountOf在derived1中是私有的,在derived2中也是私有的代码>也是一个error@Butterworth因此,即使对于静态成员函数,ACE也依赖于继承头部的访问说明符?为什么静态成员的访问权限与非静态成员的访问权限会有任何不同?如果您从某个地方获得此代码,那么最好链接到源代码。是的,错误确实存在。CountOf在derived1中是私有的,在derived2中也是私有的代码>也是一个error@Butterworth因此,即使对于静态成员函数,ACE也依赖于继承头部的访问说明符?为什么静态成员的访问权限与非静态成员的访问权限会有任何不同?如果您从某个地方获得此代码,那么最好链接到更清晰的sourceyup,如果我更改对全局成员的访问权限,它会起作用。::基类::PublicStatic();是的,这更清楚,如果我更改对全局的访问权限,它会起作用。::基类::PublicStatic();
class B {
public:
int mi; // non-static member
static int si; // static member
};
class D : private B {
};
class DD : public D {
void f();
};
void DD::f() {
mi = 3; // error: mi is private in D
si = 3; // error: si is private in D
::B b;
b.mi = 3; // OK (b.mi is different from this->mi)
b.si = 3; // OK (b.si is different from this->si)
::B::si = 3; // OK
::B* bp1 = this; // error: B is a private base class
::B* bp2 = (::B*)this; // OK with cast
bp2->mi = 3; // OK: access through a pointer to B.
}