在两个不同的接口中重载虚拟功能

时间:2010-10-07 18:05:16

标签: c++ interface overloading

我有一个问题,我有一个界面,其中的部分是模板化的,有些部分是有意义的。我正处于一个重构的中间,我将它分成两个不同的接口,其中更具体(模板化的)继承自另一个接口。例如,假设我有一个接口IArray,这将包含Size()之类的函数,因为它不关心数据类型。但我还有另一个ITArray<DataType>接口DataType GetElement(...)。 (这只是为了说明,不要对我大喊大叫使用std :: vector)。我正在做这个重构的原因是有很多非模板化接口的使用者,如果不需要模板化类型,他们不想编写接受模板化接口的模板化函数(通常extern "C"东西)

问题是我有重载函数出现在两个接口中,但由于某种原因我无法解析基类函数。这是一个简单的例子,我把它放在一起,而不是在MSVC中编译:

#include <iostream>

class IA
{
public:
        virtual void X()=0;
};

template <class DataType>
class ITA : public IA
{
public:
        //If I uncomment this line, it all works!
        //virtual void X()=0;
        virtual void X(DataType d)=0;
};

template <class DataType>
class A : public ITA<DataType>
{
public:
    void X()
    {
        std::cout << "In X" << std::endl;
    }

    void X(DataType d)
    {
        std::cout << "In X, d=" << d << std::endl;
    }
};

template <class DataType>
void DoSomething(ITA<DataType>& I, DataType d)
{
    I.X(); //MSVC can't resolve this since it's in IA, not ITA
    I.X(d);
}

int main(int argc, char* argv[])
{
    A<int> I;
    DoSomething(I,10);
}

是否有某些方法可以让IA的功能出现在ITA&lt;&gt;没有手动把它们放在那里?我看到了维护噩梦。

1 个答案:

答案 0 :(得分:0)

您是否尝试过添加using指令? IA::X隐藏了A::X

class A : ...
{
public:
    using IA::X;
    virtual void X(DataType d) = 0; 
};