C++函数重载(了解为什么这种情况不明确)
C++ Function Overloading (Understanding why this case is ambiguous)
我头很冷,所以可能是我太拥挤了,无法理解这里发生了什么,但我无法弄清楚以下内容如何不编译?
#include <string>
#include <iostream>
class Base {
public:
virtual void foo(const std::string & data) {
foo(data.data(), data.size());
}
virtual void foo(const void * bytes, int size) = 0;
};
class Derived : public Base{
public:
virtual void foo(const void * bytes, int size) {
std::cout << "Num Bytes: " << size << std::endl;
}
};
int main() {
Derived x;
std::string blah = "Hello";
x.foo(blah);
return 0;
}
我得到的错误是:
./foo.cpp: In function ‘int main()’:
./foo.cpp:25:15: error: no matching function for call to ‘Derived::foo(std::__cxx11::string&)’
x.foo(blah);
^
./foo.cpp:17:18: note: candidate: virtual void Derived::foo(const void*, int)
virtual void foo(const void * bytes, int size) {
^
./foo.cpp:17:18: note: candidate expects 2 arguments, 1 provided
如果我将foo
的第一个实例重命名为fooString
,那么一切正常,所以似乎foo
的第二个实例以某种方式隐藏了第一个实例。 但是,鉴于第二个实例有两个参数而不是一个参数,我无法弄清楚它是如何模棱两可的。
更新:没有继承也可以正常工作(如果它都是一个类),所以我怀疑我误解了一些继承规则。
类中的virtual void foo(const void * bytes, int size)
函数需要两个参数Derived
但是当从main
调用此函数x.foo(blah);
时,您只传递一个参数blah
。
您需要将两个参数传递给函数调用,因为类中的foo
函数Derived
期望的那样。
或者,如果要调用Base
类的foo
函数,请尝试x.Base::foo(blah);
代码的问题不在于函数不明确!相反,问题在于Derived
中的覆盖实际上隐藏了基类函数!如果要避免这种隐藏,可以使用using
-声明使基类版本可用:
class Derived: public Base {
// ...
public:
using Base::foo;
void foo(void const* bytes, int size) override {
// ...
}
};
或者,您可以使用调用站点上的限定来显式调用基类函数:
x.Base::foo(blah);
为了避免派生类在覆盖virtual
函数时需要做一些特殊的事情,你最好使用protected
virtual
函数的方法,并让public
函数委托给这些函数(这种方法一直用于标准C++库中的virtual
函数), 例如:
class Base {
protected:
virtual void do_foo(std::string const& s) {
this->foo(s.c_str(), s.size());
}
virtual void do_foo(void const* bytes, int size) = 0;
public:
void foo(std::string const& s) { this->do_foo(s); }
void foo(void const* bytes, int size) { this->do_foo(bytes, size); }
};
。然后在派生类中适当地重写do_foo()
。
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 不明确的成员模板查找
- gcc出现不明确的模板实例化错误
- 调用'Node'构造函数是不明确的
- 如何解决不明确的运算符过载问题?
- 使用 nullptr 调用重载方法是不明确的
- "fpclassify":对重载函数的不明确调用
- 对"列表"的引用不明确,包括头文件
- C++函数重载(了解为什么这种情况不明确)
- 可变函数指针参数的模板参数推导-处理不明确的情况
- SFINAE:如果在没有参数的情况下调用,则重载不明确
- 在模板化函数不明确的情况下表达首选项
- C++模板:专用成员函数,用于解决主模板中不明确的重载情况
- 为什么过载解决方案在这种情况下是不明确的