【发布时间】:2015-09-25 02:57:59
【问题描述】:
我以为我了解继承、虚函数和函数重载,但我有一个案例,这些功能之间的相互作用让我难以理解。
假设我有一个包含重载虚函数的简单基类,以及从它派生的第二个类:
class b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 2; }
};
class d : public b {
public:
virtual int f(int) { return 3; }
};
请注意,派生类 d 仅覆盖了其中一个重载的虚函数。
我可以实例化一个d类的对象并在其上调用f(int),没问题:
d x;
std::cout << x.f(0) << std::endl;
但是当我尝试调用 0 参数函数时:
std::cout << x.f() << std::endl;
失败了! gcc 说“没有匹配的函数来调用 'd::f()';候选者是:virtual int d::f(int)”。 clang 说“函数调用的参数太少,预期为 1,有 0;你的意思是 'b::f'?”即使d 是从b 派生的,它有一个0 参数f() 方法,编译器会忽略它,并尝试调用d 的1 参数方法。
我可以通过在派生类中重复 0 参数函数的定义来解决这个问题:
class d : public b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 3; }
};
或者,正如 clang 的错误消息所建议的,我可以使用一种我从未想过会起作用的愚蠢的消歧语法:
std::cout << x.b::f() << std::endl;
但我的问题是,我违反了什么规则,该规则试图执行/保护/捍卫什么?我认为我在这里尝试做的正是我认为继承的那种事情。
【问题讨论】:
标签: c++ inheritance overloading virtual-functions