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