访问控制和静态成员
Access control and static members
我正在阅读有关静态成员函数的 acces 说明符的信息,最终得到了 MSDN 的这个示例:我认为它有一个错误。
// 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;
}
所以它说这行是 Ok bu 它不是:
int cCount = Base::CountOf(); // OK.
这是错误消息:
error C2247: 'Base::CountOf' not accessible because 'Derived1' uses 'private' to inherit from 'Base'
那么错误是否真的存在,或者它是否与我在编译时必须添加的某些选项有关?
感谢
在C++17 Standard 部分 [class.access.base]/3 中有一个与您的代码类似的示例:
私有基类的成员可能无法作为继承的成员名称进行访问,但可以直接访问。由于指针转换 (7.11( 和显式强制转换 (8.4( 的规则,如果使用隐式转换,则从指向派生类的指针到指向不可访问基类的指针的转换可能格式不正确,但如果使用显式强制转换,则格式正确。例如
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.
}
您的代码与此不同,因为您执行Base::CountOf()
.这仍然是一个错误,因为访问是在Derived2
的上下文中检查的,并且没有对基类的私有成员的访问权限。
但是::Base::CountOf()
是正确的,因为这样就会在全局命名空间中检查访问权限。
您可以按照与标准示例类似的方式修复示例的第二部分:(::Base *)this)->CountOf()
。
相关文章:
- 如何在复杂继承中访问静态成员变量
- decltype:使用指针访问类的静态成员
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 访问控制和静态成员
- 从静态成员函数访问私有非静态类变量 - C++
- GCC 允许访问私有静态成员
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 创建类型列表并访问每种类型的静态成员?
- 常量表达式中的静态成员访问
- C++ 静态成员变量 - 文件之间的访问
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- 使用静态成员函数访问静态数据成员
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 将typeID转换为静态成员访问(C )的命名空间
- 在没有显式作用域的情况下无法访问模板基类的静态成员
- 为什么我得到带有受保护静态成员的 C2248(无法访问的成员)
- 长镜头 -- 可能有一个静态类成员,该类成员具有访问非静态成员的 lambda
- C 从实现文件中访问私有静态成员
- 静态成员函数访问静态私有变量时的链接器错误
- 在C++中,do访问说明符不控制静态成员的可见性