C++调用公共基类的私有/受保护函数

Posted

技术标签:

【中文标题】C++调用公共基类的私有/受保护函数【英文标题】:C++ Call private / protected function of a common base class 【发布时间】:2011-05-27 23:14:21 【问题描述】:

在以下示例中,有没有一种从B::bar() 调用A::foo() 的好方法?

class A 
protected:
  void foo() 
;

class B : public A 
public:
  void bar(A& a)  // edit: called with &a != this
    a.foo(); // does not work
  
;

除了将B 声明为A 的朋友之外,我想不出别的办法了,但是如果再增加一些课程,这可能会变得很丑。

有什么想法吗?

【问题讨论】:

为什么B::bar需要调用A::foo?如果A::foo 受到保护,这应该意味着只有A 类型的对象和从A 派生的任何类型应该能够调用它。如果你真的需要从一个不相关的类中调用A::foo,也许它不应该被保护。 BA 的类型时,将A 实例传递给B 的原因是什么? @Mihran 第一句是问题。 我不打算在*this 上使用B::bar,而是在其他实例上使用(实际上是在A 的其他子类上)。 A::foo() 受到保护是有原因的,我在这里写了一个库,不希望开发人员使用它。 没有什么好办法,因为你想破坏正常的访问保护规则。不过,可以“解决”受保护的访问。 ***.com/questions/3364722/… 【参考方案1】:

为什么要传递 A 类型的对象?你可以这样做:

class B : public A 
public:
  void bar() 
    foo();
  
;

或者,像这样

class B : public A 
public:
  void bar() 
    A::foo();
  
;

【讨论】:

我不打算在*this 上使用B::bar,而是在其他实例上(实际上是在A 的其他子类上)。 @lucas 听起来像是一个设计问题。为什么 foo() 受到保护? 看我上面的帖子,我不希望我的库之外的类/函数使用它。【参考方案2】:

是的,您可以使用基类函数。

class A 
protected:
  void foo() 
  void do_other_foo(A& ref) 
      ref.foo();
  
;

class B : public A 
public:
  void bar(A& a)  // edit: called with &a != this
    this->do_other_foo(a);
  
;

【讨论】:

当然可以。不是很好,但可能是最好的解决方案。谢谢!【参考方案3】:

这是一种提供类似“受保护”的访问权限的方法,允许任何派生类或对象调用。 它使用受保护的令牌类型,需要解锁特权方法:

struct A

protected:
    //Zero sized struct which allows only derived classes to call privileged methods
    struct DerivedOnlyAccessToken;

public:     //public in the normal sense :
    void foo() 

public:     //For derived types only :
    void privilegedStuff( DerivedOnlyAccessToken aKey );
;

struct B: A

    void doPrivelegedStuff( A& a )
    
        //Can create a token here
        a.privilegedStuff( DerivedOnlyAccessToken() );
    
;

int _tmain(int argc, _TCHAR* argv[])


    A a;
    a.foo();
    a.privilegedStuff( A::DerivedOnlyAccessToken() ); // compile error.

    B b;
    b.doPrivelegedStuff( a );

    return 0;

这不是我的主意。我在某个地方读过。抱歉,我不记得是谁的诡计了。

我希望编译器可以省略 aKey 参数。

【讨论】:

以上是关于C++调用公共基类的私有/受保护函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 访问基类的受保护/私有成员

受保护的与私有的析构函数

继承是真的吗?

详解C++中基类与派生类的转换以及虚基类

C++ 为啥我可以从派生类调用基类的私有虚函数?

如何禁止公共继承但允许私有(和受保护)继承