C++获取所有继承类信息的方法

C++ a way to get all inherited classes info

本文关键字:类信息 方法 继承 获取 C++      更新时间:2023-10-16

所以我有这部分代码

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++中没有一个简单的单行方法来实现这种事情。 例如,派生类无法遍历其所有基类,并调用每个基中的某个成员函数来收集结果,而无需单独显式命名所有基/成员。

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

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:。 发布不必要的不可读代码是减少获得有用帮助的机会的有效方法,因为它会让其他人感到不安。

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;
};

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