我很确定答案是否定的,但由于它很可爱,我还是会问这个问题。
示例:
class Serializable
{
public:
virtual void serialize() = 0;
};
class Unserializable
{
public:
virtual void unserialize() = 0;
};
class A : public Serializable
{
public:
virtual void serialize()
{
}
};
class B : public A, public Unserializable
{
public:
virtual void unserialize()
{
}
};
现在,有没有办法创建一个函数,其中一个参数是两个 Serializable 的实例和 Unserializable,这样就可以传递B类的对象(当然,没有引用派生类型B)?类似的东西:
void readAndWrite(Serializable_Unserializable& object);
答案 0 :(得分:3)
当然,如果您可以修改B
(以及必须继承这两者的任何其他派生类型)来派生一个继承两个接口的接口,并且不介意虚拟继承:
class Serializable_Unserializable:
public virtual Serializable,
public virtual Unserializable
还必须将虚拟继承添加到A
以及继承两个基本接口之一的任何其他类,并且可以由也继承组合接口的类继承。
class A: public virtual Serializable
现在,您可以将B
更改为:
class B: public A, public Serializable_Unserializable
它可以传递给您的void readAndWrite(Serializable_Unserializable& object)
。
如果没有这些更改,我不认为您可以定义一个函数,它只接受继承两个独立接口的对象,但允许在运行时确定类型。如果后者不是硬性要求,那么模板将是另一种选择。
答案 1 :(得分:3)
模板方式:
template <typename T>
std::enable_if_t<std::is_base_of<Serializable, T>::value
&& std::is_base_of<Unserializable, T>::value>
void readAndWrite(T& object)
答案 2 :(得分:1)
如果您不介意搜索对象的VMT以查看是否支持dynamic_cast
,则可以考虑使用Unserializable
:
void readAndWrite(Serializable& object)
{
Unserializable *uobject = dynamic_cast<Unserializable*>(&object);
if (uobject) {
// supported ...
} else {
// not supported ...
}
}