gpt4 book ai didi

c++ - 访问控制和静态成员

转载 作者:行者123 更新时间:2023-11-30 01:36:51 25 4
gpt4 key购买 nike

我正在阅读有关静态成员函数的访问说明符的内容,并以来自 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;
}

所以它说这条线是好的,但它不是:

int cCount = Base::CountOf();     // OK.

这是错误消息:

error C2247: 'Base::CountOf' not accessible because 'Derived1' uses 'private' to inherit from 'Base'

那么错误真的存在还是与我在编译时必须添加的某些选项有关?

谢谢

最佳答案

在 C++17 标准部分 [class.access.base]/3 中有一个与您的代码类似的示例:

A member of a private base class might be inaccessible as an inherited member name, but accessible directly. Because of the rules on pointer conversions (7.11) and explicit casts (8.4), a conversion from a pointer to a derived class to a pointer to an inaccessible base class might be ill-formed if an implicit conversion is used, but well-formed if an explicit cast is used. For example,

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 的上下文中检查的,并且没有对基类的私有(private)成员的访问权限。

但是 ::Base::CountOf() 是正确的,因为在全局命名空间中检查访问。

您可以按照与标准示例类似的方式修复示例的第二部分:(::Base *)this)->CountOf()

关于c++ - 访问控制和静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51032600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com