1

我目前正在做一个 C++ 项目,我有一个稍后实现的抽象接口。该接口还有一个已实现的方法,我的实现不会覆盖该方法。我的问题是,在使用我的实现时,编译器(MSVC)看不到接口方法。是什么原因造成的,我该如何解决?

代码来了。

#include <string>
#include <vector>
using std::string;

class A
{
    public:
    string name;
};

class interface
{ 
public:
    virtual int num_foo() = 0;
    virtual A* foo(int) = 0;
    virtual A* foo(string &name){
        for ( int i(0); i < num_foo(); i++)
            if ( foo(i)->name == name )
                return foo(i);
        return 0;
    }
};

class implementation : public interface
{
public:
    virtual int num_foo() { return m_foos.size(); }
    virtual A* foo(int i) { 
        //check range 
        return &m_foos[i];
    }
    std::vector<A> m_foos;
};

int main(...)
{
    implementation impl;
    // impl is properly initialized here

    string name( "bar" );
    // here comes my problem, the MSVC compiler doesn't see foo(string &name)
    // and gives an error
    A *a = impl.foo( name );
}
4

4 回答 4

5

名称解析发生在重载解析之前。在impl.foo( name )中,然后编译器查看implementation类并仅找到virtual A& foo(int i). 它不查看基类,因为它找到了具有正确名称的函数。

为了纠正这种使用,可以using interface::foo向派生类添加一个声明,以将所有基版本拉foo入派生类,以实现重载决策。通常,我宁愿避免重载函数,并且我可能会给出foo不同函数名称的变体。

(其他错误是您没有定义string,vectorm_ones; 您尝试使用->而不是.引用,并且您尝试在返回对 . 的引用的函数中返回 0。A

于 2009-09-04T07:29:35.243 回答
3

要在子类中重新发布基方法(例如 foo(string))以进行重载,请添加

  using interface::foo;

进入类实现。

于 2009-09-04T07:35:29.040 回答
1
class implementation : public interface{
    public:
       using interface::foo;
       int num_foo() { return m_foos.size(); }
       A& foo(int i)
       {   //check range
           return m_ones[i];
       }
       vector<A> m_foos;
       vector<A> m_ones;
};
于 2009-09-04T07:38:31.730 回答
0

这只是一个问题,因为您正在访问该implementation界面,该界面确实有一个foo成员,正如@charles-bailey 的回答中已经指出的那样。

从语义上讲,您要调用的是interface方法 foo,因此您可能实际上应该调用它:

int main()
{
    implementation impl;
    string name( "bar" );
    interface& interf = impl;
    A *a = interf.foo( name );
    A *b = interf.foo( 4 );
}

这也将允许您通过设为私有来实现非虚拟接口习语。implementation::foo如果您尝试impl.foo直接调用,您仍然会失败,但是对于所有参数类型,您都会失败,并出现相同的错误。

(我知道这个问题很老,但 NVI 更老了......)

于 2017-05-03T19:11:54.643 回答