如何使用参数选项创建函数?

时间:2010-12-07 01:29:48

标签: c++ winapi visual-c++

创建一个可以有不同参数列表的函数 像这样的东西

void s(int d, double t);
void s(string d, UNIT e);
提前谢谢。
编辑2:
好的,当我在课堂上尝试时,它不起作用...
这是我的基类

class GUIInterface
{
public:
    .....
    virtual void LoadFile(string fileName) = 0;
    virtual void LoadFile(LPCWSTR fileName) = 0;
        ....
};

我收到此错误。

error C2259: 'GUIButtons' : cannot instantiate abstract class
1>          due to following members:
1>          'void GUIInterface::LoadFile(LPCWSTR)' : is abstract

好的,在我的GUIButtons中,我覆盖了virtual void LoadFile(string fileName) = 0;,但我没有覆盖第二个。
像这样

class GUIButtons : public GUIInterface
{
     .....
     void LoadFile(string fileName) { ... }
     ...
}

1 个答案:

答案 0 :(得分:4)

只要参数可以产生唯一的分辨率,函数重载在C ++中是完全合法的。在上面的例子中,第一个参数总是足以唯一地解析其中一个函数。

在类上下文中,如果成员函数在同一个类中定义,它就像对自由函数一样工作。

捕获许多C ++新手的一个场景是继承:

class Foo {
public:
    void s(int d, double t);
};

class Bar {
public:
    void s(string d, UNIT e);
};

// ...

Bar b;
b.s("hello", 42); // Fine
b.s(3, 4.5);      // FAIL

第二次调用tp b.s将不起作用,因为C ++会查找包含该符号的第一个范围。在这种情况下,它会找到Bar::s,即使Bar::s(string, UNIT)未能通过匹配,C ++也不会去尝试基类。一旦找到带有符号的范围,搜索就会在那里停止,然后无论是否在该点找到匹配的函数。

您可以通过在派生类中明确重新引入基类符号来解决此问题:

class Bar {
public:
    using Foo::s;
    void s(string d, UNIT e);
};

编辑:响应OP的编辑2 ...

您看到的问题与重载无关。您根本没有覆盖派生类GUIButtons中的纯虚拟成员函数。使用匹配的派生类函数覆盖基类函数是重载的一个不同概念。