C++ 虚拟函数重新定义会对另一个基类隐藏同名的其他重载函数

C++ 虚拟函数重新定义会对另一个基类隐藏同名的其他重载函数,c++,inheritance,function,overloading,C++,Inheritance,Function,Overloading,好的,我使用虚拟函数、重载函数和多重继承。当然,结果不太好 场景:Classbase1有一个需要由其子级指定的虚拟函数。 类derived派生自两个父类base1和base2,并应使用base2的现有功能来定义base1的虚拟功能 这没关系,但当然很尴尬。其动机是我无法更改类base2,并且已经大量投资的现有接口具有同名的base1和base2类函数。这没关系,在base1中没有实现任何内容,它应该重定向到base2 我的问题是因为base2有几个重载函数,它们与所讨论的虚拟函数同名。所有其他重

好的,我使用虚拟函数、重载函数和多重继承。当然,结果不太好

场景:Class
base1
有一个需要由其子级指定的虚拟函数。 类
derived
派生自两个父类
base1
base2
,并应使用
base2
的现有功能来定义
base1
的虚拟功能

这没关系,但当然很尴尬。其动机是我无法更改类
base2
,并且已经大量投资的现有接口具有同名的
base1
base2
类函数。这没关系,在
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;
}
如果重载的
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;
}
//此版本不编译
#包括
使用名称空间std;
基类1{
公众:

virtual void samenameFunc(int scratch){cout在
派生的
类的定义中,可以添加一个using声明,使函数从
base2
可见:

using base2::samenameFunc;
using base2::samenameFunc;