5

我正在实现一个静态多态性:

template<typename T>
class Base {
public:
    void method() {
         // do something
         impl();
         // do something else
    }
    void impl() { // intended to be private
        static_cast<T*>(this)->impl();
    }
};

class Derived : public Base<Derived> {
public:
     void impl() { // intended to be private
     }
};

此代码是动态多态类的静态实现,其中 void impl() 是虚拟的和私有的。

我已经实现了多态性(静态)。但是我必须将方法 void impl() 公开,以便允许从基类访问它。我希望方法 void impl() 再次成为私有的。可以做到吗?

更新:我不想写

friend class Base<Derived>;

在 Derived 类中,因为它允许 Base 访问 Derived 的所有成员。

4

1 回答 1

7

在您的课程中添加一行Derived

class Derived : public Base<Derived> {
public:
private:
     void impl() { // intended to be private
     }
     friend class Base<Derived>;
};

它将基类指定为朋友,允许我以impl私有方式编译代码。

编辑

正如@Oliv 在评论中所建议的那样,律师-客户成语的实现如下所示:


template<typename T>
class Attorney;

template<typename T>
class Base {
public:
    void method() {
        // do something
        impl();
        // do something else
    }
private:
    void impl() { // intended to be private
        Attorney<T>::impl(*static_cast<T*>(this));
    }
};


class Derived : public Base<Derived> {
private:
    void impl() { // intended to be private
    }
    friend class Attorney<Derived>;
};

template<typename T>
class Attorney {
private:
    friend class Base<Derived>;

    static void impl(Derived & c) { // add additional parameters as needed by impl
        c.impl();
    }
};

于 2019-05-26T14:46:21.263 回答