我对OOP类的一些概念有疑问,假设我有以下类:
因此,String和Integer类继承了Parser类,因为它们都需要有关流的特定信息,如位置,长度等。
现在问题来自于我有一个同时使用String和Integer函数的函数。
让我们将这个新函数放在一个名为MultipleOperations的类中。 MultipleOperations需要String和Integer类,因此它继承了这两个类,但String和Integer类已经继承了Parser,所以当尝试从Parser类访问某些数据时是不明确的。
另一方面,如果set 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类。
答案 0 :(得分:0)
这是一个已知的钻石层次问题,只存在于C ++中。尽管实现多个接口很好,但应该避免对类进行多重继承。这就是为什么更多现代语言如c#和java不允许多重继承。
至于你的课程,我没有看到任何关系。你应该使用has-a(引用而不是inherting)
答案 1 :(得分:0)
您的问题称为the diamond problem。
对此有几种解决方案,其中一种,您可能会发现it很有趣。我建议你稍微谷歌吧。