访问接口的私有继承如何允许可访问对象访问访问私有访问实现
How can private inheritance from a visitor interface allow a visitable object to access visit private visit implementations?
下面的代码显示了一个类,该类从一个接口私有继承,该接口在不授予调用对象友谊的情况下访问其私有函数。我对此感到困惑,但真的看不出编译器能想出什么更好的解决方案(代码编译和运行)。为什么这样做?
#include <iostream>
class IVisitor;
class IVisitable
{
public:
virtual void Accept(IVisitor& visitor) const = 0;
};
class VisitableA;
class VisitableB;
class IVisitor
{
public:
virtual void Visit(const VisitableA& a) = 0;
virtual void Visit(const VisitableB& b) = 0;
};
class VisitableA : public IVisitable
{
public:
virtual void Accept(IVisitor& visitor) const
{
visitor.Visit(*this);
}
};
class VisitableB : public IVisitable
{
public:
virtual void Accept(IVisitor& visitor) const
{
visitor.Visit(*this);
}
};
class PrivateVisitor : private IVisitor
{
public:
PrivateVisitor(IVisitable& v)
{
v.Accept(*this);
}
private:
virtual void Visit(const VisitableA& a)
{
std::cout << "I saw An";
}
virtual void Visit(const VisitableB& b)
{
std::cout << "I saw Bn";
}
};
int main(int argc, char* argv[])
{
VisitableA a;
VisitableB b;
PrivateVisitor p_a(a);
PrivateVisitor p_b(b);
}
访问说明符仅在编译时进行检查,并在应用它们的对象的静态类型上进行检查。
在PrivateVisitor
构造函数中,*this
对象被强制转换为IVisitor
。在这种情况下,继承的类型无关紧要,因为我们属于PrivateVisitor
类型,所以我们有完全的访问权限。
该对象在IVisitable
对象(VisitableA
或VisitableB
)内部使用,并调用Visit
成员函数。当对象的动态类型为PrivateVisitor
时,静态型为IVisitor
(引用为IVisitor&
型)。根据IVisitor
类检查访问说明符,其中两个Visit
重载都是公共,因此编译器接受调用。
函数在最终重写器中是private这一事实并不重要,因为访问是通过基类执行的,其中函数是public。
这里最重要的是这个:
PrivateVisitor : private IVisitor
幸运的是,PrivateVisitor被强制转换为IVisitor的唯一地方是构造函数:
PrivateVisitor::PrivateVisitor(IVisitable& v)
{
v.Accept(*this);
}
构造函数可以访问类的私有基。
private在类范围内,而不是对象范围内。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 通过指向指针数组的指针访问子类的属性
- 如何使用单独文件中的派生类访问友元函数对象