Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;设计模式:是否可以将继承的方法私有化到派生类? 是C++中的以下设置/设计模式? 领导阶层 工人阶级 has方法M() MyWorker类(继承Worker)_C++_Design Patterns_Inheritance - Fatal编程技术网

C++;设计模式:是否可以将继承的方法私有化到派生类? 是C++中的以下设置/设计模式? 领导阶层 工人阶级 has方法M() MyWorker类(继承Worker)

C++;设计模式:是否可以将继承的方法私有化到派生类? 是C++中的以下设置/设计模式? 领导阶层 工人阶级 has方法M() MyWorker类(继承Worker),c++,design-patterns,inheritance,C++,Design Patterns,Inheritance,Leader类有许多Worker,需要从Worker类调用方法M()。但是,我不希望Worker的任何实现(即MyWorker)能够访问方法M()。在这种情况下,公共、私人和保护似乎都不起作用 可以这样设置吗?或者我应该如何设计其他东西 谢谢 编辑:(添加示例案例) 假设M()是GiveMoney(),Leader=Parent,Worker=Child。我只希望父母能给孩子钱(而孩子不能给自己钱) 像这样: #include <iostream> class Leader {

Leader类有许多Worker,需要从Worker类调用方法M()。但是,我不希望Worker的任何实现(即MyWorker)能够访问方法M()。在这种情况下,公共、私人和保护似乎都不起作用

可以这样设置吗?或者我应该如何设计其他东西

谢谢

编辑:(添加示例案例)

假设M()是GiveMoney(),Leader=Parent,Worker=Child。我只希望父母能给孩子钱(而孩子不能给自己钱)

像这样:

#include <iostream>

class Leader
{
  private:
    virtual char M() = 0;
  public:
    void foo() { std::cout << M(); }
};

class Worker : public Leader
{
  private:
    virtual char M() { return 'm'; }
};
打印
m

class MyWorker : public Worker
{
  void foo2() { std::cout << M(); }
};
class MyWorker:公共工作者
{
void foo2(){std::cout您可以:

  • 使
    M()
    成为
    Worker
    中的私有函数,并声明
    Leader
    Worker
    的朋友
  • M()
    的逻辑从
    Worker
    移到
    Leader
    中。就我个人而言,这是我会采取的方法,因为无论
    M()
    做什么,你都不想让任何其他
    Worker
    去做

  • 你为什么要这样做?你到底想实现什么?知道你的最终目标将帮助我们帮助你找到你想要的答案

    如果您想完全隐藏一些实现细节,最好的办法是为worker的公共端创建一个单独的基类,让您的私有worker按组合包含公共位

    编辑在我看来,你让自己的生活变得不必要的困难。除非其他人能够控制童工的实施,为什么不直接从童工那里给钱打电话呢

    类似的内容可能适用于您的示例:

    class Parent // Leader
    {
    private:
        Child* m_pChildren;
    };
    
    class Child : public ChildSelf
    {
    public:
        char GiveMoney() { return 'm'; }
    };
    
    class ChildSelf
    {
        Run();
        Jump();
        ClimbTrees();
    };
    
    class MyChild : public ChildSelf
    {
        void RunFaster() { Run(); Run(); }
    };
    

    您的儿童工作者实现只能访问ChildSelf,这为您提供了所需的安全级别。

    听起来您应该研究访客设计模式:

    这不是完全相同的方法,但我相信如果在
    Leader
    类上定义一个
    Visit(Worker)
    方法,在
    Worker
    类上定义一个
    Accept(Leader)
    方法,然后调用
    private M()
    ,就可以得到您想要的功能

    鉴于我的帖子被否决,我决定提供一些额外的信息可能会有所帮助:

    class Leader;
    
    class Worker
    {
    virtual void M() = 0;
    public:
        void Accept( const Leader & w)
            {
                M();
            }
    };
    
    class Leader
    {
    public:
    void Visit ( Worker & w) const
        {
        w.Accept(*this);
        }
    };
    
    class MyWorker : public Worker
    {
    virtual void M()
        {
        std::cout << "M()" << std::endl;
        }
    };
    
    
    int main(int argc, char **argv)
    {
    Leader l;
    MyWorker myW;
    myW.Accept(l)
    return 0;
    }
    
    班长;
    班主任
    {
    虚空M()=0;
    公众:
    无效接受(施工负责人和w)
    {
    M();
    }
    };
    班长
    {
    公众:
    无效访问(工人和工人)施工
    {
    w、 接受(*本条);
    }
    };
    类别MyWorker:公共工作者
    {
    虚空M()
    {
    
    std::cout将
    M
    私有,并声明
    Leader
    Worker
    的朋友。您仍然可以在
    Worker
    的派生类中实现
    M

    class Leader;
    
    class Worker
    {
        virtual void M() = 0;
        friend class Leader;
    };
    
    class Leader
    {
        Worker* w;
    
    public:
        void doSomething() { w->M(); }
    };
    
    class MyWorker : public Worker
    {
        void M() { ... } // No problem. Even if `M` is private in the base class, it
                         // can still be overridden, but not accessed.
    };
    

    你希望一个类不能访问它自己的方法,但该方法可以从另一个类调用吗?我认为这在任何语言中都是不可能的。如果将M()定义为private;并通过public进行扩展,则Post代码应该会导致MyWorker无法访问private方法。事实上,M()只要Worker(M()的原始所有者)是调用M()的唯一对象,is private就可以正常工作,因为通常情况下,实例可以对同一类的其他实例上的私有方法/成员进行操作
    被定义为私有,
    Leader
    Worker
    的朋友,如果我理解正确,一切都应该按照你的意愿进行。如果我不想让Worker继承Leader呢?例如,假设方法是AddFood()我不希望工人们能够养活自己。然后你必须让
    Worker
    成为
    Leader
    的朋友,或者你必须重写
    Leader
    ,这样它就不必调用
    Worker::M
    (例如,将需要调用的功能移动到
    Worker
    类中(但这可能不适合你的特殊情况)。
    class Leader;
    
    class Worker
    {
        virtual void M() = 0;
        friend class Leader;
    };
    
    class Leader
    {
        Worker* w;
    
    public:
        void doSomething() { w->M(); }
    };
    
    class MyWorker : public Worker
    {
        void M() { ... } // No problem. Even if `M` is private in the base class, it
                         // can still be overridden, but not accessed.
    };