C++中调用继承函数和重写行为

oyxsuwqo  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(112)

为什么会给予此错误- 'void D::func(const D &)':无法将参数1从“const C”转换为“const D &”
如何纠正这一点,我想调用基地的func从派生的func,但注意func是一个朋友函数?

class C
{
public:
    C()
    {
        cout << "in C ctor" << endl;
    }

    friend void func(const C& abc1)
    {
        cout << "in C's func" << endl;
    }
};

class D : public C
{
public:
    D()
    {
        cout << "in D ctor" << endl;
    }

    void func(const D& abc)
    {
        func(static_cast<const C&>(abc));
        cout << "in D's func" << endl;
    }
};

int main()
{
    D d;
    d.func(d);
}

为什么这个类似的例子能起作用呢
https://ideone.com/eNmvng

kknvjkwl

kknvjkwl1#

我不确定语法对函数可见性有什么作用,但这是可行的:

class C
{
public:
    C()
    {
        cout << "in C ctor" << endl;
    }

    friend void func(const C& abc1);
};

void func(const C& abc1)
{
    cout << "in C's func" << endl;
}

class D : public C
{
public:
    D()
    {
        cout << "in D ctor" << endl;
    }

    void func(const D& abc)
    {
        ::func(abc);
        cout << "in D's func" << endl;
    }
};

int main()
{
    D d;
    d.func(d);
}

为了完整起见,这也是可行的:

class C
{
public:
    C()
    {
        cout << "in C ctor" << endl;
    }

    friend void func(const C& abc1)
    {
        cout << "in C's func" << endl;
    }
};

// Make function visible in global scope
void func(const C& abc1);

class D : public C
{
public:
    D()
    {
        cout << "in D ctor" << endl;
    }

    void func(const D& abc)
    {
        ::func(abc);
        cout << "in D's func" << endl;
    }
};

int main()
{
    D d;
    d.func(d);
}

相关问题