我有一个基类,称之为Foo
,派生类,称之为Bar
。 Foo
定义了一个虚函数doSomething
,有两个重载 - 见下文:
class Foo
{
public:
virtual void doSomething(std::string const & s)
{
printf("doSomething(std::string const &): %s\n", s.c_str());
}
virtual void doSomething(std::string const & s, int d)
{
printf("doSomething(std::string const &, int): %s %d\n", s.c_str(), d);
}
};
class Bar
: public Foo
{
public:
virtual void doSomething(std::string const & s) override
{
printf("Bar: %s\n", s.c_str());
}
};
现在我尝试从派生类Bar的实例化中调用这两个方法:
int main()
{
Bar * b = new Bar();
b->doSomething("string");
b->doSomething("string", 78);
delete b;
}
我得到第二次重载的错误(在Bar
中未被覆盖的重载)。覆盖的那个很好,但是另一个(仍然在基类中定义)我得到一个错误
error C2660: 'Bar::doSomething': function does not take 2 arguments
如果我删除Bar
中的单个覆盖,那么它只是从Foo
派生但不覆盖任何内容,main
中的代码编译得很好。如果我重写两者,也一样。
我确定我在这里愚蠢,但这似乎没有意义。任何人都可以帮助阐明这一点,特别是如何在没有a)创建两个函数名称的情况下工作,或者b)总是重写两者,或者c)转换到基类(对于我的用例来说)疼痛)?非常感谢。