0

我对 OOP 类的一些概念有疑问,可以说我有以下类:

  • Parser 类,其中包含用于解析流数据的数据
  • 包含用于解析流数据的字符串操作的字符串类
  • 包含用于解析流数据的整数操作的整数类

所以 String 和 Integer 类继承了 Parser 类,因为它们都需要关于流的特定信息,如位置、长度等。

现在问题来了,当我有一个同时使用 String 和 Integer 函数的函数时。

让我们将这个新函数放在一个名为 MultipleOperations 的类中。MultipleOperations 需要 String 和 Integer 类,因此它同时继承,但 String 和 Integer 类已经继承 Parser,因此当尝试从 Parser 类访问某些数据时是模棱两可的。

另一方面,如果设置 String 和 Integer 类具有 MultipleOperations 的组合,那么我将无法访问 Parser 类。

此外,我不太了解“具有”的概念,因为在大多数情况下,我需要引用基类中的数据,因此使其成为“是”。

这是我的问题的一个例子:

class Parser{
private:
    int errorcode;
    char comment;
    const char* address;
    const char* maxaddress;
    unsigned int position;
public:
    Parser(const char* _address, const char* _maxaddress) : errorcode(NO_ERROR_PRESENT) {};
    const char* s_address(const char* _address) {address = _address;}
    const char* s_maxaddress(const char* _maxaddress) {maxaddress = _maxaddress;}
    const char* s_position(unsigned int _pos) {position = _pos;}
    char r_comment() const {return comment;}
    const char* r_address() const {return address + position;}
    const char* r_maxaddress() const {return maxaddress;}
    unsigned int r_position() const {return position;}

    int geterror();
    void set_error(int code) {errorcode = code;}

    void set_comment(const char char_comment);
    void set_position(unsigned int position);
    void resetboundary(unsigned int address, unsigned int maxaddress);
};

class Integer: public Parser {
public:
    //Get an int token
    int GetInt();
};

class String: public Parser {
private:
    int NullByToken(char*, int, char);                          //Null a string by token
    void CleanString(std::string string);                       //Clean an string to its simple form (removing spaces, tabs, etc)
    public:
        Displacement* GetEndOfLine();                           //Get len till end of line
        Displacement* GetSimpleString();
        bool SplitByChar(const char token, SplitString* setstrings);
};

class MultiOperation: public String, public Integer {
    void* GetDataByPrefix(unsigned int Type, char token, const char* prefixcmp);
};

函数 GetDataByPrefix 需要访问 Parser 类并且需要访问 String 和 Integer 类。

4

2 回答 2

0

这是一个已知的菱形层次结构问题,仅存在于 C++ 中。尽管实现多个接口很好,但您应该避免类的多重继承。这就是为什么更现代的语言(例如 c# 和 java)不允许多重继承的原因。

至于您的课程,我看不到任何 is-a 关系。您应该使用 has-a (引用而不是继承)

于 2012-09-17T04:16:02.033 回答
0

你的问题叫做钻石问题

对此有多种解决方案,仅举一个,您可能会觉得它很有趣。我建议你google一下。

于 2012-09-17T04:17:11.083 回答