c – 用于朋友功能的使用声明

前端之家收集整理的这篇文章主要介绍了c – 用于朋友功能的使用声明前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C 11中,可以使用using声明使外部(公共)可访问私有基类的公共成员.例如
  1. class A {
  2. private:
  3. int i = 2;
  4. public:
  5. void f() { i = 3; }
  6.  
  7. friend bool operator==(const A& l,const A& r) { return l.i == r.i; }
  8. };
  9.  
  10. class B : private A {
  11. public:
  12. using A::f;
  13. };
  14.  
  15. int main() {
  16. B b,b2;
  17. b.f();
  18. }

b.f()是可能的,因为在B的定义中使用了A :: f.

是否有可能写一个类似的声明,这将使B& amp;到A&朋友函数运算符=(A&,A&)可以,所以b == b2可以在main()中调用

解决方法

不,只有B可以在内部将自己投射到A,否则就不可能,因为从客户的角度来看,B不是A而是A

即使你用你的朋友bool operator =替换成员函数等于:

  1. class A {
  2. private:
  3. int i = 2;
  4. public:
  5. void f() { i = 3; }
  6.  
  7. bool equals(const A& r){return i == r.i;}
  8. };
  9.  
  10. class B : private A {
  11. public:
  12. using A::f;
  13. using A::equals;
  14. };

在编译时,你不能调用b.equals(b2),因为从调用者的角度来看,从B类型到A类型都不可能进行隐式转换(由于私有继承).

您需要提供自己的操作符==或将您的继承更改为公共或受保护.这是一个例子,其中B声明了自己的朋友bool operator ==

  1. class B : private A {
  2. public:
  3. using A::f;
  4. friend bool operator==(const B& l,const B& r)
  5. {
  6. return (static_cast<A>(l) == static_cast<A>(r)) && true;
  7. // "true" is a stand-in for some other condition
  8. }
  9. };

阅读更多isocpp

编辑:
如果你真的想玩游戏,你会注意到我说没有可能进行隐式转换,但是有些明确的转换是.因为B在技术上从A派生,你可以做指针转换使它工作,但我不推荐它:

  1. class A {
  2. private:
  3. int i = 2;
  4. public:
  5. void f() { i = 3; }
  6.  
  7. bool equals(const A* r){return i == r->i;}
  8. };
  9.  
  10. class B : private A {
  11. public:
  12. using A::f;
  13. using A::equals;
  14. };
  15.  
  16. int main() {
  17. B b,b2;
  18. b.f();
  19. (::A*)(&b)->equals((::A*)(&b2));
  20. }

或者,如果您希望保留原始运算符==语法,则可以使用指针转换的丑陋表兄,引用转换

  1. class A {
  2. private:
  3. int i = 2;
  4. public:
  5. void f() { i = 3; }
  6.  
  7. friend bool operator==(const A& l,b2;
  8. b.f();
  9. ((::A&)(b)) == ((::A&)(b2));
  10. }

有关更多信息,请参见§11.2[class.access.base]

猜你在找的C&C++相关文章