创建一个可以有不同参数列表的函数 像这样的东西
void s(int d, double t);
void s(string d, UNIT e);
提前谢谢。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) { ... }
...
}
答案 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
中的纯虚拟成员函数。使用匹配的派生类函数覆盖基类函数是重载的一个不同概念。