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
,也许它不应该被保护。
当B
是A
的类型时,将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++调用公共基类的私有/受保护函数的主要内容,如果未能解决你的问题,请参考以下文章