C++ 一种获取所有继承 类 信息的方法
C++ a way to get all inherited classes info
所以我有这部分代码
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 class 中的 GetCapabilites() 重写为 return 所有继承的 classes return 值,这样我就不必像以前那样显式地编写它们在这里?
标准 C++ 中没有一种简单的单行方式来实现这类事情。例如,派生 class 无法遍历其所有基 classes,并在每个基中调用某个成员函数来收集结果,而无需显式命名所有 bases/members分别
可以调用继承的函数,并将它们的结果收集到一个向量中。例如;
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;
};
您可以利用多个继承构造函数来存储功能。
所以我有这部分代码
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 class 中的 GetCapabilites() 重写为 return 所有继承的 classes return 值,这样我就不必像以前那样显式地编写它们在这里?
标准 C++ 中没有一种简单的单行方式来实现这类事情。例如,派生 class 无法遍历其所有基 classes,并在每个基中调用某个成员函数来收集结果,而无需显式命名所有 bases/members分别
可以调用继承的函数,并将它们的结果收集到一个向量中。例如;
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;
};
您可以利用多个继承构造函数来存储功能。