C:继承和重载解析
作者:互联网
我在这里读一个C拼图:http://gotw.ca/gotw/005.htm
我不理解他对静态与动态重载决策(或默认参数)的解释,所以我试着提炼出这个问题并自己编写一些测试:
class Base {
public:
virtual void foo() {cout << "base/no parameters" << endl;}
virtual void foo(int a) {cout << "base/int" << endl;}
};
class Derived : public Base {
public:
void foo() {cout << "derived/no parameters" << endl;}
void foo(double a) {cout << "derived/int" << endl;}
};
int main() {
Base* ptr = new Derived;
ptr->foo();
ptr->foo(1.0);
}
输出是:
derived/no parameters
base/int
如何调用foo(),C似乎认识到它指向Derived但是在调用foo(1.0)中,C在Derived类中没有看到void foo(double a)函数?
在我看来,存在竞争的想法,C具有多态性,这解释了第一次调用,但是重载解析是在编译时完成的,这解释了第二次调用.
解决方法:
C++ does not see
void foo(double a)
function in the Derived class?
C确实看到了函数,但由于函数签名的不同,它与Base :: foo的虚拟性无关:
virtual void Base::foo(int); // 'Base' signature
void Derived::foo(double); // 'Derived' signature
所以这里有两个Derived :: foo(double)的重要事实:
>与Base :: foo(int)无关(覆盖)
>不是虚拟方法(即使虚拟方法没有帮助)
第一点更重要,因为当你打电话时
// 'ptr' refers 'Base' method signature; so 'double' implicitly converts to 'int'
ptr->foo(1.0);
使用基指针.在vtable列表中,它只有一个Base :: foo(int)条目.因此它被称为.
标签:c,inheritance,static,dynamic,overload-resolution 来源: https://codeday.me/bug/20190723/1513904.html