虚函数重定义隐藏了来自另一个基类的其他同名重载函数

Noa*_*ahR 4 c++ inheritance overloading function

好的,我正在使用虚函数,重载函数和多重继承.当然这并不好.

场景:Class base1有一个需要由其子节点指定的虚函数.类derived两个亲本的派生base1base2,并应使用base2现有的功能来定义base1的虚函数.

这没关系,但当然很尴尬.动机是我无法改变类base2和现有的接口已经大量投入了同名base1base2类功能.这没关系,没有实现base1,它只应重定向到base2.

我的问题出现了,因为base2有几个与所讨论的虚函数同名的重载函数.所有其他重载版本在编译时基本上都是隐藏的.

这是一个小的演示代码.

// this version does not compile, overloaded samenameFunc(int, int) cannot be found in the derived class.
#include <iostream>
using namespace std;

class base1 {
public:
    virtual void samenameFunc(int scratch) { cout << "from base1: " << scratch << std::endl; }
};

class base2 {
public:
    void samenameFunc(int scratch) { cout << "samenameFunc from base2: " << scratch << std::endl; }
    void samenameFunc(int scratch, int foo)  { cout << "samenameFunc(2 args) from base2: " << scratch << ", " << foo << std::endl; }
};

class derived : public base1, public base2 {
public:
    void samenameFunc(int scratch) { base2::samenameFunc(scratch); }// { cout << "from derived: " << scratch << std::endl; }
};

int main()
{
    derived d;

    d.samenameFunc(66);
    d.samenameFunc(77, 88);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而编译错误:

$ g++ inheritance_overload_tester.cc 
inheritance_overload_tester.cc: In function ‘int main()’:
inheritance_overload_tester.cc:26: error: no matching function for call to ‘derived::samenameFunc(int, int)’
inheritance_overload_tester.cc:18: note: candidates are: virtual void derived::samenameFunc(int)
Run Code Online (Sandbox Code Playgroud)

如果重载的samenameFunc(int, int是重命名的,我可以按预期编译和运行.但请记住,我实际上无法改变base2.

// this version does compile
#include <iostream>
using namespace std;

class base1 {
public:
    virtual void samenameFunc(int scratch) { cout << "from base1: " << scratch << std::endl; }
};

class base2 {
public:
    void samenameFunc(int scratch) { cout << "samenameFunc from base2: " << scratch << std::endl; }
    void anotherFunc(int scratch, int foo)  { cout << "anotherFunc(2 args) from base2: " << scratch << ", " << foo << std::endl; }
};

class derived : public base1, public base2 {
public:
    void samenameFunc(int scratch) { base2::samenameFunc(scratch); }// { cout << "from derived: " << scratch << std::endl; }
};

int main()
{
    derived d;

    d.samenameFunc(66);
    d.anotherFunc(77, 88);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果在现有的演示文稿中无法修复,有人可以建议使用不同的对象继承模型来解决我的问题吗?

Jam*_*lis 5

derived类的定义中,您可以添加using声明以使函数base2可见:

using base2::samenameFunc;
Run Code Online (Sandbox Code Playgroud)