C++ 如何使用派生类实例调用基类重载func,
我试图理解派生类是否重载了基类func,(基类有int参数,而der类有双参数),当我创建der类实例并使用正确的参数调用func name时,只调用der func??有人能帮我吗。。在代码(dd.f(d1);)的第28行,我可以得到基类func调用 这是代码C++ 如何使用派生类实例调用基类重载func,,c++,inheritance,C++,Inheritance,我试图理解派生类是否重载了基类func,(基类有int参数,而der类有双参数),当我创建der类实例并使用正确的参数调用func name时,只调用der func??有人能帮我吗。。在代码(dd.f(d1);)的第28行,我可以得到基类func调用 这是代码 using namespace std; class base { public : virtual void f (int i); }; class der : public base{ p
using namespace std;
class base {
public :
virtual void f (int i);
};
class der : public base{
public:
void f ( double d);
};
void base::f(int i){
cout << "Base::f \n";
}
void der::f(double d){
cout <<"Der::f \n";
}
int main(){
der dd;
int i =99;
double d1 = 3232.232;
dd.f(i); // why this calls der class func???
dd.f(d1);
base *ptr = new der();
ptr->f(i);
dynamic_cast<der *>(ptr)->f(d1);
return 0;
}
使用名称空间std;
阶级基础{
公众:
虚空f(inti);
};
类别:公共基地{
公众:
无效f(双d);
};
空基::f(int i){
cout当您在派生类中用与基类中相同的名称声明函数时,基类中的函数被隐藏
解决方案
您可以创建派生类
class Derived {
virtual void store(long l) {
//store another way.
}
}
and call it like
Derived d;
d.store(1);
然后有人认为“我可以更快地存储INT!”并创建
Base::store(int)
如果不存在这样的隐藏,则失败。
< p>我不是C++程序员,但我确信语言识别了传递给它的参数所调用的函数/方法,以及名称(f)不同于f(double)。对多态性< /p> < p >搜索为什么调用dE类Func??
因为编译器仅通过在同一类中声明的函数之间的签名来选择函数。例如,如果您有这样的函数:
class der : public base{
public:
void f ( double d);
void f (int i ){cout << "f(int)" <<endl;}
};
class-der:public-base{
公众:
无效f(双d);
void f(int i){cout以下称为覆盖
class baseClass
{
public:
virtual void DoIt()
{//.........
}
}
class child : public baseClass
{
void DoIt()
{
baseClass::DoIt();
}
}
微软Visual C++中的P>
您可以使用\u super代替基类名称\u super::DoIt()
如果在您的类的公共体中使用base::confusingMethod;时出现问题,您所做的不是重写它,而是使用另一个具有不同签名的方法,如下所示
class base
{
public:
base(){}
virtual void Job(int x)
{
cout<<"Base"<<endl;
}
};
class son : public base
{
public:
using base::Job;
son(){}
virtual void Job(float x)
{
cout<<"Son"<<endl;
}
};
类基
{
公众:
base(){}
虚拟无效作业(int x)
{
cout编译器不会在多个作用域中搜索重载。它会在类层次结构中找到“f(…)”的第一个版本并在那里停止。然后它会搜索该类,并且只搜索该类的重载。它会将der::f(double)作为重载,隐式转换为int到double,并使用它。您可以将“using base::f;”放在“der”中要获得所需的行为。根据您的解释,应该调用基类的方法。问题是为什么不调用它。“编译器不需要转到基类”-比这更糟糕。编译器不会转到基类,即使它需要。尝试将“f(int)”更改为“f(std::string)”然后将它称为“DE.F(STD:String())”而不是“DER。(i)”。它不会编译,因为它不能将STD::string转换成双。这个程序只编译,因为C++将自动转换int到双。@ JojG79是的,只有在没有任何(同名)的情况下,编译器才会尝试在基类中找到适当的函数。在派生类中。感谢您的帮助,我之前知道作用域解析运算符。但没有想到:)是的,即使我尝试使用字符串参数调用func f,但即使func在基类中正确声明,它也失败了。但正如RiaD建议添加的“using base::f”在der类中,甚至这个问题也得到了解决。我不知道如果您在der类中重载func,那么基类func将被隐藏。这是一个很好的学习方法。感谢大家分享信息并参与讨论。干杯
class baseClass
{
public:
virtual void DoIt()
{//.........
}
}
class child : public baseClass
{
void DoIt()
{
baseClass::DoIt();
}
}
class base
{
public:
base(){}
virtual void Job(int x)
{
cout<<"Base"<<endl;
}
};
class son : public base
{
public:
using base::Job;
son(){}
virtual void Job(float x)
{
cout<<"Son"<<endl;
}
};