从层次结构接口获取接口

时间:2014-03-04 15:10:57

标签: c++ inheritance casting

我有一个接口层次结构如下:

class interface1
{
public:
    virtual ~interface1() = 0;
}

class interface2 : public interface1
{
public:
    virtual ~interface2() = 0;
}

我的数据模型具有可以从Interface1或interface2派生的类:

class cls1 : public interface1
{
}
class cls2 : public interface2
{
}

我想写一个在interface1或interface2

上工作的重载函数
void function1(interface1 * obj)
{
    // do something here
}
void function1(interface2 * obj)
{
    // do something here
}

现在我想创建两个对象--cls1和cls2,并调用function1:

{
    .........
    cls1 *p1 = new cls1;
    cls2 *p2 = new cls2;

    function1(p1);
    function1(p2);        
    .........
}

我的问题是 - 在这两种情况下,总是调用function1(interface1 * obj)。我不想使用if-else结合dynamic_cast(这是创建接口层次结构的全部要点)。 任何人都可以建议我用cls2的对象调用function1(interface2 * obj)吗?

3 个答案:

答案 0 :(得分:1)

您尝试做的事情与虚拟功能非常相似。为什么不将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
    }
}

答案 1 :(得分:0)

比我更了解情况的人告诉我,依靠编译器隐式检测你想要的类的返回值是一个坏主意。这可能导致问题没有结束,因为它们的选择有时与您预期的不同。

所以,在这种情况下,我会使用一个显式的强制转换,比如

function1( static_cast<interface1*>( p1 ));
function1( static_cast<interface2*>( p2 ));

我知道它不那么紧凑,但是如果你从现在起一年后查看你的代码就会更有意义。

答案 2 :(得分:0)

从比其他答案更高级的观点来看:您要完成的是根据参数的类型调度函数调用。 C ++一般不支持这个。

有两种选择:

  1. 正如@PaF所写,您可以将该功能设为虚拟。
  2. 如果你真的不想让这个函数成为一个类成员,你可以模拟所谓的双重调度(根据调用的对象确定要调用的函数)作为参数的类型)通过应用访问者模式。这样,您可以根据参数的类型调用函数,同时避免使用dynamic_cast。