朋友功能的使用声明

tml*_*len 7 c++ using friend c++11 c++14

在C++ 11中,可以通过声明使外部(公共)可以访问私有基类的公共成员using.例如

class A {
private:
    int i = 2;
public:
    void f() { i = 3; }

    friend bool operator==(const A& l, const A& r) { return l.i == r.i; }
};

class B : private A {
public:
    using A::f;
};

int main() {
    B b, b2;
    b.f();
}
Run Code Online (Sandbox Code Playgroud)

b.f()因为using A::f在定义中是可能的B.

是否有可能编写一个类似的声明,它可以使友元函数的up-cast B&成为A&可能operator==(A&, A&),以便b == b2可以调用main()

And*_*dyG 4

不,只能B在内部将其自身强制转换为A,否则这是不可能的,因为从客户端的角度来看,它B不是一个 A,而是具有一个 A

\n\n

即使您将其替换friend bool operator=为成员函数equals

\n\n
class A {\nprivate:\n    int i = 2;\npublic:\n    void f()  { i = 3; }\n\n    bool equals(const A& r){return i == r.i;}\n};\n\nclass B : private A {\npublic:\n    using A::f;\n    using A::equals; \n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

您需要提供您自己的继承operator==或将您的继承更改为publicprotected。这是一个B声明自己的示例friend bool operator==

\n\n
class B : private A {\npublic:\n    using A::f;\n    friend bool operator==(const B& l, const B& r)\n    {\n        return (static_cast<A>(l) == static_cast<A>(r)) && true; \n        // "true" is a stand-in for some other condition\n    }\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

阅读更多内容请访问isocpp

\n\n
\n\n

编辑:\n如果你真的想玩游戏,你会注意到我说不可能有隐式转换,但有些显式转换是可能的。因为B从技术上讲是否源于A您可以进行指针转换以使其工作,但我不推荐它:

\n\n
class A {\nprivate:\n    int i = 2;\npublic:\n    void f()  { i = 3; }\n\n    bool equals(const A* r){return i == r->i;}\n};\n\nclass B : private A {\npublic:\n    using A::f;\n    using A::equals;\n};\n\nint main() {\n    B b, b2;\n    b.f();\n    (::A*)(&b)->equals((::A*)(&b2));  \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,如果您想保留原始内容,您可以使用指针转换的丑陋表弟,参考转换operator==或者,如果您想保留原始语法

\n\n
class A {\nprivate:\n    int i = 2;\npublic:\n    void f()  { i = 3; }\n\n    friend bool operator==(const A& l, const A& r) { return l.i == r.i; }\n};\n\nclass B : private A {\npublic:\n    using A::f;\n};\n\nint main() {\n    B b, b2;\n    b.f();\n    ((::A&)(b)) == ((::A&)(b2));  \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关更多信息,请参阅 \xc2\xa711.2 [class.access.base]

\n