从接口层次结构获取接口
Getting interface from Hierarchy of interfaces
我有一个接口层次结构如下:
class interface1
{
public:
virtual ~interface1() = 0;
}
class interface2 : public interface1
{
public:
virtual ~interface2() = 0;
}
我的数据模型具有可以从接口 1 或接口 2 派生的类:
class cls1 : public interface1
{
}
class cls2 : public interface2
{
}
我想编写一个在接口 1 或接口 2 上运行的重载函数
void function1(interface1 * obj)
{
// do something here
}
void function1(interface2 * obj)
{
// do something here
}
现在我想创建两者的对象 - cls1 和 cls2,并调用函数 1:
{
.........
cls1 *p1 = new cls1;
cls2 *p2 = new cls2;
function1(p1);
function1(p2);
.........
}
我的问题是 - 在这两种情况下,总是调用函数 1(接口 1 * obj)。我不想将 if-else 与dynamic_cast结合使用(这是创建接口层次结构的重点)。谁能建议我一种使用 cls2 对象调用函数 1(接口 2* obj) 的方法?
你试图做的事情听起来与虚函数非常相似。为什么不将function1
定义为类的成员函数:
class interface1
{
public:
virtual void function1()
{
// Do what you want to do when deriving from interface1
}
}
class interface2 : public interface1
{
public:
virtual void function1()
{
// Do what you want to do when deriving from interface2
}
}
比我知识渊博的人告诉我,依靠编译器隐式检测你想要的类返回值是一个坏主意。这可能会导致无穷无尽的问题,因为它们的选择有时与您预期的不同。
所以,在这种情况下,我会使用显式强制转换,例如
function1( static_cast<interface1*>( p1 ));
function1( static_cast<interface2*>( p2 ));
我知道它没有那么紧凑,但是如果你从现在起一年后查看你的代码,它会更有意义。
从比其他答案更高级的角度来看:您要完成的是根据参数的类型调度函数调用。C++一般不支持这一点。
有两种选择:
- 正如@PaF所写,你可以使函数虚拟化。
- 如果您确实不想将该函数作为类成员,则可以通过应用访问者模式来模拟所谓的双重调度(根据调用它的对象以及参数的类型来确定要调用的函数)。这样,您可以根据参数的类型调用函数,同时避免dynamic_cast。
相关文章:
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 从两个 4x64 位整数数组中获取取模
- 如何获取C++中的输入并将其"split"到列表中?换句话说,取 N 个输入并放入 N 长度的数组中
- (C++) 取字符串的每个字符并将其放入数组中并获取所述数组的大小?
- 无法在 WinRT 中获取异步操作结果 (Windows::Foundation::IAsyncOperating 接口
- 从参考中获取的指针可以在定义明确的C 中取无效
- 从 SIOCGIFCONF 和 SIOCGIFADDR 获取的 Solaris SPARC 中虚拟接口的接口名称不正确
- 如何从MFC DLL中获取与COM包裹的C#对象的接口
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
- 从接口层次结构获取接口
- 在C++中使用 WMI 获取适配器的接口索引
- C 和R接口,获取输出
- 使用 ATL 编译 dll,并将方法参数作为接口,但将它们作为 coclass 获取
- 如何为类的继承层次结构的获取者创建统一的接口
- 在 RasDial 之后获取 IP 地址/接口号码
- C++获取网络接口信息
- .NET 从具有 www 接口的打印机获取数据
- 从 DLL (C++) 获取虚拟类接口
- 获取第 N 种类型的可变参数模板 **当一个或多个类型是接口时**
- 错误:(E112) 获取接口失败:端口未绑定 - SystemC