使用继承扩展接口
Extending interfaces using inheritance
class IA
{
public:
virtual void a() = 0;
};
class A: public IA
{
public:
virtual void a()
{
}
};
class IB
{
public:
virtual void b() = 0;
};
class B: public IB, public A
{
public:
virtual void b()
{
}
};
void f(IA* p)
{
}
int main()
{
B b = B();
IB* p = &b;
f(p);
}
这是在C++中实现具有继承的接口的正确方法吗?如果是这样,如何获取代码中的行f(p);
进行编译?基本上,我希望IB
可以从IA
继承,但这会给 B 带来问题。
更新
我想要的是让IB
包含IA
的接口,如下所示。但是,此代码不会编译,因为IA::a()
和A::a()
相互冲突。我该怎么办?
class IA
{
public:
virtual void a() = 0;
};
class A: public IA
{
public:
virtual void a()
{
}
};
class IB : public IA
{
public:
virtual void b() = 0;
};
class B: public IB, public A
{
public:
virtual void b()
{
}
};
更新 2
这个编译,看起来正确吗?我需要所有这些虚拟吗
class IA
{
public:
virtual void a() = 0;
};
class A: virtual public IA
{
public:
virtual void a()
{
}
};
class IB: virtual public IA
{
public:
virtual void b() = 0;
};
class B: virtual public IB, public A
{
public:
virtual void b()
{
}
};
嗯,这当然是正确的方法,但是行f(p)
不应该按原样编译,想象实现IB
但不实现IA
的类,这是可能的,所以你不能假设它们都实现了IA
。如果你想假设这一点,你可以从IA
继承IB
,但这是另一种设计。它可以像这样实现:
class IA
{
public:
virtual void a() = 0;
};
class A: virtual public IA
{
public:
virtual void a()
{
}
};
class IB : virtual public IA
{
public:
virtual void b() = 0;
};
class B: public IB, public A
{
public:
virtual void b()
{
}
};
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- C++中的VLA,扩展名为std=C++11
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 为重写std::exception的库生成swig接口时出错
- 继承Java集合接口(Set、Map、List等)的C++等价物是什么?或者扩展AbstractCollection
- 如何正确扩展接口
- 无需reinterpret_cast的可扩展库接口
- 使用继承扩展接口
- 具有扩展接口的派生类的集合.如何在没有动态强制转换的情况下访问派生接口
- 如何扩展/组合包含纯虚拟函数的接口类
- 为什么在 C++1y 中没有接口来获取 std 文件系统库扩展中的用户/组信息
- 可以在不重新编译客户端代码的情况下扩展虚拟接口吗?