其他分享
首页 > 其他分享> > C:继承和重载解析

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