c++ - 派生带/不带参数的基类函数

标签 c++ class inheritance overloading overriding

以下代码有什么问题?

  class B
{
public:
    int test()
    {
        cout<<"B:test()"<<endl;
        return 0;
    }
    int test(int i)
    {
        cout<<"B test(int i)"<<endl;
        return 0;
    }
};

class D: public B
{
public:

    int test(char x) { cout<<"D test"<<endl; return 0; }
};

int main()
{
    D d;
    d.test();
    return 0;
}

最佳答案

问题是名称隐藏。派生类 D 中的函数 test() 隐藏 基类 test() 的重载>B,因此表达式中的重载决议不会考虑这些:

d.test()

只需添加一个 using 声明:

class D: public B
{
public:
    using B::test;
//  ^^^^^^^^^^^^^^
    int test(char x) { cout<<"D test"<<endl;}
};

另请注意,基类 B 中的 test() 重载应该返回 int,但它们什么也不返回.

根据 C++11 标准的第 6.6.3/2 段,从返回值函数的末尾掉落而不返回任何内容是未定义的行为

关于c++ - 派生带/不带参数的基类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031179/

相关文章:

c++ - 3D 模型文件并从中创建三角形网格

javascript - 通过jquery悬停切换标签,添加删除类{显示:none}

c++ - 使用命名空间标准和库

c++ - 访问新数据库时应用程序崩溃

C++:为什么 weak_ptr 没有 shared_ptr&& 构造函数?

c++ - 指向另一个类函数成员的类成员函数变量

c++ - 如何在 C++ 中将指向基类的指针分配给派生类的对象?

java - 未定义的构造函数错误

javascript - 创建一个从 ES6 Map 扩展的类

c++ - 关于wxWidgets继承的问题