gpt4 book ai didi

C++ 私有(private)继承和静态成员/类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:23 26 4
gpt4 key购买 nike

我试图阻止一个类将它的“this”指针转换成它的接口(interface)之一的指针。我通过中间代理类使用私有(private)继承来做到这一点。问题是我发现私有(private)继承使得层次结构中继承类下的所有类都无法访问基类的所有公共(public)静态成员和类型。

class Base
{
public:
enum Enum
{
value
};
};

class Middle : private Base
{
};

class Child : public Middle
{
public:
void Method()
{
Base::Enum e = Base::value; // doesn't compile BAD!
Base* base = this; // doesn't compile GOOD!
}
};

我已经在 VS2008(所需版本)和 VS2010 中都试过了,都没有用。

谁能想出解决方法?或者停止转换的不同方法?

我也很好奇这种行为,它只是编译器实现的副作用,还是设计使然?如果是设计的,那为什么呢?我一直认为私有(private)继承意味着没有人知道 Middle 继承自 Base。然而,所展示的行为暗示私有(private)继承的意义远不止于此,事实上,与不在类层次结构中的任何命名空间相比,Child 对 Base 的访问权限更少!

最佳答案

您应该能够通过完全限定它来访问 Base::Enum:

class Child : public Middle
{
public:
void Method()
{
::Base::Enum e = ::Base::value;
}
};

这是语言指定的行为 (C++03 §11.2/3):

Note: A member of a private base class might be inaccessible as an inherited member name, but accessible directly.

后面是一个与您的示例代码非常相似的扩展示例。

但是,Visual C++ 2008 和 Visual C++ 2010 似乎都没有正确实现这一点,因此虽然您可以使用 ::Base::Enum 类型,但您仍然无法访问 ::基础::值(value)。 (实际上,Visual C++ 似乎在这方面犯了很多错误,因为它错误地允许您使用非完全限定的 Base::Enum)。

要“解决”这个问题,您可以将 using 声明添加到 Middle 类:

class Middle : private Base
{
protected:

using Base::Enum;
using Base::value;
};

这不会让您在 Child 类中使用 Base::EnumBase::value,但它允许您使用 EnumvalueMiddle::EnumMiddle::value

关于C++ 私有(private)继承和静态成员/类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047511/

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