下面是一个c ++代码:
#include<iostream>
using namespace std;
class Base {
public:
virtual int f() const { cout << "Base::f()\n"; }
virtual void f(string) const {}
virtual void g() const {}
};
class Derived4 : public Base {
public:
int f(int) const { cout << "Derived4::f()\n"; }
};
int main() {
string s ("hello");
Derived4 d4;
Base *br = &d4; //line 5
//br->f(1);//line 6
br->f();//line 7
br->f(s);//line 8
}
代码工作正常,但第6行是错误的。代码调用f()的基本版本。我还读过如果你在派生类中重新定义函数,那个func的所有基类def都隐藏了吗?我错了吗?
答案 0 :(得分:2)
有许多编译错误。把它放在一边 -
多态性是一个运行时概念。因此,函数调用调度机制在运行时发生。您应该在基类和派生类中具有相同的成员函数签名,以使其起作用。
br->f(1);//line 6
在编译时,编译器尝试与Base
中可用的成员函数的签名匹配。在这种情况下,f(string)
接受字符串类型,因此接受错误。
我还读过如果你在派生类中重新定义函数, 所有隐藏的func的基类def?
这是一种不同的情况。
struct foo{
fooBar(int i);
};
struct bar:foo{
fooBar(std::string);
};
void test()
{
bar obj;
obj.fooBar(11); // bar class hides the member function foo::fooBar(int)
}