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

C++ how to extend a class and cast to appropriate type with same name

首先,让我用"I am new to C++"作为这个问题的序言!这可能会变得非常简单,我会觉得很愚蠢,但现在我真的可以使用帮助。我知道如何使用 Abstract class 来做到这一点,但我不能在这里使用 Abstract class 。另外,如果有更好的方法,我愿意接受建议。


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

MasterCommand 可以做 ClientCommand 可以做的一切,还有一些方法。

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

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

  1. 我没有正确投射
  2. 我没有正确构建它
  3. 或者我做错了什么

这是我的测试代码:


基地 CLASS HEADER:

#ifndef __OPCommand_H_
#define __OPCommand_H_

class OPCommand {

public:
    virtual void doSomething();
    void doClientStuff();
};

#endif //__OPCommand_H_

基地 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";
}

扩展 CLASS HEADER:

#ifndef __OPMasterCommand_H_
#define __OPMasterCommand_H_

#include "OPCommand.h"

class OPMasterCommand : public OPCommand {

public:
    void doSomething();
    void doMasterStuff();
};

#endif //__OPMasterCommand_H_

扩展 CLASS BODY:

#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";
}

测试 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_

测试 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'

我的通灵调试技巧告诉我,由于您是 C++ 的新手,您忘记了 header 包含守卫(这是您看到的 redefinition of 'OPCommand' 错误的一个非常常见的原因)。

尝试在您的 header 文件中加入这样的内容(更改每个 header 的名称):

#ifndef OPCOMMAND_H_included
#define OPCOMMAND_H_included

<original header contents>

#endif

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

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

此外,如果您从 ClientCommand 派生 MasterCommand,则无需多重继承:Command <= ClientCommand <= MasterCommand,仅此而已。 MasterCommand 是一个命令,因为它是 ClientCommand.

的子class