C++ 如何设计我需要在基类中使用派生类成员的类?

C++ 如何设计我需要在基类中使用派生类成员的类?,c++,inheritance,combinations,virtual-functions,class-design,C++,Inheritance,Combinations,Virtual Functions,Class Design,通常,我们使用虚函数或组合来设计类。我知道,使用虚函数会使类更结构化;使用组合将很容易实现,但可能会编写更多重复的代码。 在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我假设它将用于名为AParser的a协议,名为BParser的B协议,如下所示: 类解析器{ 公众: 语法分析器(…); virtual~Parser()=默认值; 虚拟布尔解析(…)=0; 私人: //有些属性可能很常见 }; 类AParser():公共解析器{ 公众: 解析器(…):解析器(){}; ~AParse

通常,我们使用虚函数或组合来设计类。我知道,使用虚函数会使类更结构化;使用组合将很容易实现,但可能会编写更多重复的代码。 在这种情况下:我需要一个解析器,它将用于不同的协议。现在,我假设它将用于名为AParser的a协议,名为BParser的B协议,如下所示:

类解析器{
公众:
语法分析器(…);
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是不同的协议,无法设计A
    GetData()
    ,它们返回不同的类型,不同的类型有自己的文件。我还有另一个问题:如何在基类ptr/ref中使用派生类函数,如果函数不能设计为虚拟函数,您需要从
    解析器调用
    getData
    ?需要
    AData
    的东西可以使用
    apaser
    ,需要
    BData
    的东西可以使用
    BParser
    ,而不在乎的东西可以不调用它吗?@Klaus我在问在这种情况下如何设计类,你明白了吗<代码>组合
    ,对不起,我的意思是
    组合
    ,它也可以完成目标,但可能会写更多重复的代码,我想知道如何实现目标使用继承。为什么我要描述这么多的背景?因为这么多相关的问题的答案是“在基类中定义虚函数”,我认为具体的问题需要特定的背景,你不这么认为吗?