c++继承时函数重名问题


#include<iostream>
using namespace std;

//基类Base
class Base {
public:
    void func();
    void func(int);
};
void Base::func() { cout << "Base::func()" << endl; }
void Base::func(int a) { cout << "Base::func(int)" << endl; }

//派生类Derived
class Derived : public Base {
public:
    void func(char*);
    void func(bool);
};
void Derived::func(char* str) { cout << "Derived::func(char *)" << endl; }
void Derived::func(bool is) { cout << "Derived::func(char *)" << endl; }

int main() {
    Derived d;
    d.func("c.biancheng.net");
    d.func(true);
    //d.func();  //compile error
    d.func(10);  //compile error
    d.Base::func();
    d.Base::func(100);

    return 0;
}

运行结果为什么是

img


而不是预想的Derived::func(char *);Derived::func(char *);cout << "Base::func(int)";cout << "Base::func()";cout << "Base::func(int)"

【以下回答由 GPT 生成】

问题的原因是派生类Derived中的函数func与基类Base中的函数func发生了函数重名问题。在派生类中使用一个与基类中同名的函数时,派生类中同名的函数会隐藏基类中的同名函数。因此,在派生类中调用同名函数时,会直接调用派生类中的该函数。

解决这个问题的方法是使用using语句来引入基类的同名函数,使得它们在派生类中可见。具体的步骤如下:

  1. 在派生类的public部分添加using语句,引入基类中的同名函数。
class Derived : public Base {
public:
    using Base::func;
    void func(char*);
    void func(bool);
};
  1. 编译并运行程序:
int main() {
    Derived d;
    d.func("c.biancheng.net");
    d.func(true);
    d.func();  // 现在可以正常调用基类中的同名函数了
    d.func(10);  // 现在可以正常调用基类中的同名函数了
    d.Base::func();
    d.Base::func(100);

    return 0;
}

这样就能够正确地调用派生类和基类中的同名函数了。

运行结果应该是:

Derived::func(char *)
Derived::func(bool)
Base::func()
Base::func(int)
Base::func()
Base::func(int)

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^