C++ 如何设计我需要在基类中使用派生类成员的类?
通常,我们使用虚函数或组合来设计类。我知道,使用虚函数会使类更结构化;使用组合将很容易实现,但可能会编写更多重复的代码。 在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我假设它将用于名为AParser的a协议,名为BParser的B协议,如下所示:C++ 如何设计我需要在基类中使用派生类成员的类?,c++,inheritance,combinations,virtual-functions,class-design,C++,Inheritance,Combinations,Virtual Functions,Class Design,通常,我们使用虚函数或组合来设计类。我知道,使用虚函数会使类更结构化;使用组合将很容易实现,但可能会编写更多重复的代码。 在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我假设它将用于名为AParser的a协议,名为BParser的B协议,如下所示: 类解析器{ 公众: 语法分析器(…); virtual~Parser()=默认值; 虚拟布尔解析(…)=0; 私人: //有些属性可能很常见 }; 类AParser():公共解析器{ 公众: 解析器(…):解析器(){}; ~AParse
类解析器{
公众:
语法分析器(…);
virtual~Parser()=默认值;
虚拟布尔解析(…)=0;
私人:
//有些属性可能很常见
};
类AParser():公共解析器{
公众:
解析器(…):解析器(){};
~AParser()override=默认值;
void bool解析器(…)覆盖;
内联数据()常量{返回数据}
私人:
阿达塔;
}
类BParser():公共解析器{
公众:
BParser(…):解析器(){};
~BParser()override=默认值;
void bool解析器(…)覆盖;
内联BData Data()常量{return BData_;}
私人:
b数据;
}
那么,AData
和BData
都是它们自己的私有数据,不应该放在基类中
另外,不应该虚拟数据/BData Data()=0
(错误!!!)
那么,如何设计类来解决这个问题呢?
现在我有两个想法,但我认为它们不能满足我
static\u cast(this)->derivedFunc()
,首先这个操作并不优雅,其次如果我使用这个操作,继承+封装
仍然有意义吗virtual std::map GetData()=0
,然后使用成员字段名
获取字段数据,但如何使用派生函数仍然是一个问题我想这个问题可能是一个类设计问题,你能帮我回答这个问题吗?如果两个解析器没有返回相同的数据,它们没有相关的接口,可能不应该有一个公共的基类
如果它们返回相同的数据,则将
GetData
函数放在基类中。或者更好的是,直接从Parse
返回数据这个GetData()
函数有什么意义?为什么不能通过解析器的基类接口使用解析器呢?您是否在基类接口中缺少GetData()
?完全不清楚您想要什么。尽管如此,你的描述还是不清楚。示例:“虚拟功能或组合”什么是“组合”。什么组合?请尽量少描述所有的背景知识,并把重点放在与编程相关的事情上。顺便说一句:“内联”关键字在这个上下文中是模糊的!不,我不能。由于AB是不同的协议,无法设计AGetData()
,它们返回不同的类型,不同的类型有自己的文件。我还有另一个问题:如何在基类ptr/ref中使用派生类函数,如果函数不能设计为虚拟函数,您需要从解析器调用getData
?需要AData
的东西可以使用apaser
,需要BData
的东西可以使用BParser
,而不在乎的东西可以不调用它吗?@Klaus我在问在这种情况下如何设计类,你明白了吗<代码>组合
,对不起,我的意思是组合
,它也可以完成目标,但可能会写更多重复的代码,我想知道如何实现目标使用继承。为什么我要描述这么多的背景?因为这么多相关的问题的答案是“在基类中定义虚函数”,我认为具体的问题需要特定的背景,你不这么认为吗?