C ++如何扩展类并转换为具有相同名称的适当类型

时间:2015-03-09 16:08:21

标签: c++ polymorphism

首先,让我以“我是C ++新手”为前提这个问题!这可能会变得非常简单,我会感到非常愚蠢,但现在我真的可以使用帮助了。我知道如何使用Abstract类来完成此操作,但我不能在这里使用Abstract类。此外,如果有更好的方法,我愿意接受建议。


我有一个ClientCommand(基类)和一个MasterCommand(扩展基类)

enter image description here

MasterCommand可以完成ClientCommand可以执行的所有操作以及更多方法。

在我的应用程序中,我想对两个命令使用相同的名称。如果对象是客户端,那么它将仅限于客户端方法。如果对象是Master,那么它将拥有所有客户端方法和Master方法。

我知道必须有办法做到这一点。

  1. 我没有正确地投射
  2. 我没有正确构建
  3. 或者还有别的我做错了
  4. 这是我的测试代码:


    BASE CLASS HEADER:

    #ifndef __OPCommand_H_
    #define __OPCommand_H_
    
    class OPCommand {
    
    public:
        virtual void doSomething();
        void doClientStuff();
    };
    
    #endif //__OPCommand_H_
    

    BASE CLASS BODY:

    #include "OPCommand.h"
    
    void OPCommand::doSomething() {
        // TODO - implement OPClientCommand::doSomething
        throw "Not yet implemented";
    }
    
    void OPCommand::doClientStuff() {
        // TODO - implement OPClientCommand::doClientStuff
        throw "Not yet implemented";
    }
    

    扩展班主任:

    #ifndef __OPMasterCommand_H_
    #define __OPMasterCommand_H_
    
    #include "OPCommand.h"
    
    class OPMasterCommand : public OPCommand {
    
    public:
        void doSomething();
        void doMasterStuff();
    };
    
    #endif //__OPMasterCommand_H_
    

    延伸课程:

    #include "OPMasterCommand.h"
    
    void OPMasterCommand::doSomething() {
        // TODO - implement OPMasterCommand::doSomething
        throw "Not yet implemented";
    }
    
    void OPMasterCommand::doMasterStuff() {
        // TODO - implement OPMasterCommand::doMasterStuff
        throw "Not yet implemented";
    }
    

    TEST CLASS HEADER:

    #ifndef __TestMe_H_
    #define __TestMe_H_
    
    
    #include "OPMasterCommand.h"
    #include "OPCommand.h"
    
    class TestMe {
    
    public:
        OPCommand* command;
        OPMasterCommand* masterCommand;
    
    public:
        void startHere();
        OPMasterCommand* getMasterCommand();
        OPCommand* getCommand();
        bool isMaster();
    
    };
    
    #endif //__TestMe_H_
    

    TEST CLASS BODY:

    密切注意startHere方法:

    #include "TestMe.h"
    
    void TestMe::startHere() {
        if (isMaster()) {
            masterCommand = getMasterCommand();
        } else {
            command = getCommand();
        }
    
        // Here - How can I point to or cast to the appropriate type, so I can use the same name everywhere in my code?
    
    }
    
    OPMasterCommand* TestMe::getMasterCommand() {
        if (!masterCommand) {
            masterCommand = new OPMasterCommand();
        }
        //command = dynamic_cast<OPCommand*> (masterCommand);
        return masterCommand;
    }
    
    OPCommand* TestMe::getCommand() {
        if (!command) {
            command = new OPCommand();
        }
        return command;
    }
    
    bool TestMe::isMaster() {
        return true;
    }
    

    我无法建立这个。现在我正在重新定义'OPCommand'

2 个答案:

答案 0 :(得分:2)

我的通灵调试技巧告诉我,既然你是C ++的新手,你会忘记你的标题包括警卫(这是你看到的redefinition of 'OPCommand'错误的一个非常常见的原因。)

尝试在头文件中添加类似的内容(更改每个标题的名称):

#ifndef OPCOMMAND_H_included
#define OPCOMMAND_H_included

<original header contents>

#endif

答案 1 :(得分:1)

回答问题的第二部分:如何为所有命令使用单个基类和单个变量?

您需要查找Command模式。在您的情况下,您需要从Command派生所有类。

此外,如果从ClientCommand派生MasterCommand,则不需要多重继承:Command&lt; = ClientCommand&lt; = MasterCommand,它就是它。 MasterCommand isa Command,因为它是ClientCommand的子类。