gpt4 book ai didi

c++ - 访问者接口(interface)的私有(private)继承如何允许可访问对象访问访问私有(private)访问实现?

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

以下代码显示了一个类,该类私有(private)地继承自一个接口(interface),该接口(interface)可以在不授予调用对象友元的情况下访问其私有(private)函数。我对此感到困惑,但无法真正看到编译器可以提出什么更好的解决方案(代码编译和运行)。为什么会这样?

#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 A\n";
}

virtual void Visit(const VisitableB& b)
{
std::cout << "I saw B\n";
}
};

int main(int argc, char* argv[])
{
VisitableA a;
VisitableB b;

PrivateVisitor p_a(a);
PrivateVisitor p_b(b);
}

最佳答案

访问说明符只在编译时检查,并且在应用它们的对象的静态类型上检查它们。

PrivateVisitor 构造函数中,*this 对象被转换为 IVisitor。在这种情况下,继承类型无关紧要,因为我们属于 PrivateVisitor 类型,所以我们拥有完全访问权限。

该对象在IVisitable对象(VisitableAVisitableB)内部使用,Visit成员函数是叫。对象的动态类型为PrivateVisitor静态类型为IVisitor(引用类型为IVisitor&).访问说明符根据 IVisitor 类进行检查,其中 Visit 重载都是 public,因此编译器接受调用。

函数在最终覆盖程序中是私有(private)这一事实并不重要,因为访问是通过基类执行的,其中函数是公共(public)。 p>

关于c++ - 访问者接口(interface)的私有(private)继承如何允许可访问对象访问访问私有(private)访问实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12046631/

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