【问题标题】:C++ a way to get all inherited classes infoC++ 一种获取所有继承类信息的方法
【发布时间】:2020-08-27 20:27:32
【问题描述】:

所以我有这部分代码

class Robot
{
    public: string Name;
    public: explicit Robot(const string& Name) { this->Name = Name; }
    public: Robot() { Name = "Robotic"; }
    public: virtual ~Robot() = default;
    public: virtual vector<string> GetCapabilities() = 0;
    public: friend ostream& operator << (ostream&, const Robot&);
};

class TalkingRobot : virtual public Robot
{
    public: explicit TalkingRobot(const string& Name) { this->Name = Name; }
    public: virtual ~TalkingRobot() = default;
    public: vector<string> GetCapabilities() { return { "Talking" }; }
};

class WalkingRobot : virtual public Robot
{
    public: explicit WalkingRobot(const string& Name) { this->Name = Name; }
    public: virtual ~WalkingRobot() = default;
    public: vector<string> GetCapabilities() { return { "Walking" }; }
};

class VaxBot : public TalkingRobot, public WalkingRobot
{
    public: explicit VaxBot(const string& Name):TalkingRobot(Name), WalkingRobot(Name) { this->Name = Name; }
    public: virtual ~VaxBot() = default;
    public: vector<string> GetCapabilities() { return { "Talking","Walking" }; }
};

它们有一个虚函数 GetCapabilites()。
有没有办法在我的 VaxBot 类中重写 GetCapabilites() 以返回所有继承的类返回值,这样我就不必像在这里那样显式地编写它们?

【问题讨论】:

    标签: c++ inheritance vector multiple-inheritance


    【解决方案1】:
    class Robot
    {
        public: string Name;
        public: vector<string> Capabilities;
        public: explicit Robot(const string& Name) { this->Name = Name; }
        public: Robot() { Name = "Robotic"; }
        public: virtual ~Robot() = default;
        public: vector<string> GetCapabilities() { return this->Capabilities; }
        public: friend ostream& operator << (ostream&, const Robot&);
    };
    
    class TalkingRobot : virtual public Robot
    {
        public: explicit TalkingRobot(const string& Name) { 
            this->Name = Name;
            this->Capabilities.push_back("Talking");
        }
        public: virtual ~TalkingRobot() = default;
    };
    
    class WalkingRobot : virtual public Robot
    {
        public: explicit WalkingRobot(const string& Name) { 
            this->Name = Name;
            this->Capabilities.push_back("Walking");
        }
        public: virtual ~WalkingRobot() = default;
    };
    
    class VaxBot : public TalkingRobot, public WalkingRobot
    {
        public: explicit VaxBot(const string& Name):TalkingRobot(Name), WalkingRobot(Name) { this->Name = Name; }
        public: virtual ~VaxBot() = default;
    };
    

    您可以利用多个继承构造函数来存储 Capabilities。

    【讨论】:

      【解决方案2】:

      在标准 C++ 中没有一种简单的单行方式来实现这种事情。例如,派生类无法遍历其所有基类,并在每个基类中调用某个成员函数来收集结果,而无需分别显式命名所有基类/成员。

      可以调用继承的函数,并将它们的结果收集到一个向量中。例如;

       std::vector<std::string> VaxBot::GetCapabilities()
       {
            std::vector<std::string> values(TalkingRobot::GetCapabilities());
      
            std::vector<std::string> more_values(WalkingRobot::GetCapabilities());
      
            values.insert(values.end(), more_values.begin(), more_values.end());
      
            return values;
       }
      

      如果您有两个以上这样的基础,则可以扩展上述内容。这意味着显式地复制代码,但正如我在开篇中所说的那样,没有办法隐式地实现这种机制。

      您的代码还有其他问题,但您没有问过这些问题,所以我不会解决这些问题。而且,为了可读性,不要在每一行都使用文本public:。发布不必要的不​​可读代码是减少获得有用帮助机会的有效方法,因为它会让其他人感到紧张。

      【讨论】:

      • 这是最接近我想要的东西!谢谢
      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2013-09-06
      相关资源
      最近更新 更多