在旧项目中,有一些IPC机制需要Serializable
接口实现。
有人创建了需要TxtSerializable
实现的新IPC机制。
现在,必须创建新的IPC机制来发送和接收CsvSerializable
对象。
什么是使该对象可序列化为多种格式而不破坏原有代码的一种优雅方法?我的意思是,不破坏期望Serializable
对象的IPC。
这里是一个抽象示例,代表实现代码的方式:
#include <string>
#include <iostream>
class Serializable {
public:
virtual std::string Serialize() = 0;
};
class TxtSerializable : public Serializable {
public:
virtual std::string TxtSerialize() = 0;
};
class CsvSerializable : public Serializable {
public:
virtual std::string CsvSerialize() = 0;
};
class MyClass : public TxtSerializable, CsvSerializable {
public:
std::string Serialize() override {
return CsvSerialize();
}
std::string TxtSerialize() override {
// Convert to an arbitrary text string
return "TXT";
}
std::string CsvSerialize() override {
// Convert to a CSV string
return "CSV";
}
};
void SomeIpcFunction(const Serializable* serialize) {
// Do something
}
int main(int argc, char *argv[]) {
MyClass my_class;
SomeIpcFunction(&my_class); // ambiguous conversion from derived class to base class
return 0;
}
是的,存在所谓的“钻石问题”,可以通过虚拟继承来解决。参见https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem
在您的情况下,您要从public virtual
继承Serializable
。