我试图理解派生类是否重载了基类func,(基类有int参数,而der类有双参数)当我创建了类实例并使用正确的参数调用func名称时,只调用了der func ??有人可以帮助我..在代码的第28行(dd.f(d1);)有没有办法,我可以得到基类func调用。
这是代码。
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;
}
答案 0 :(得分:2)
当在基类中使用与基类同名的派生类声明函数时,隐藏基类中的函数。
`use base::f`
#include <iostream>
using namespace std;
class base {
public :
virtual void f (int i);
};
class der : public base{
public:
using base::f;
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;
dd.f(i); // Base::f
return 0;
}
class Base {
virtual void store(long l){
//both int and long could be processed
}
}
您创建派生类
class Derived {
virtual void store(long l) {
//store another way.
}
}
and call it like
Derived d;
d.store(1);
然后有人认为“我可以更快地存储整数!”并创建
Base::store(int)
如果没有像这样的隐藏
你会失败答案 1 :(得分:0)
我不是C ++程序员,但我确信该语言标识了传递给它的参数调用的函数/方法,以及名称。 f(int)与f(double)不同。做一些关于多态的搜索
答案 2 :(得分:0)
为什么这会调用der class func ???
因为编译器仅通过签名来选择在同一个类中声明的函数之间的函数。例如,如果您有这样的事情:
class der : public base{
public:
void f ( double d);
void f (int i ){cout << "f(int)" <<endl;}
};
致电dd.f(i);
会将您带到输出f(int)
。
由于你的der
类有一个函数f()
,虽然调用参数不匹配,编译器不需要转到base
类,它只是转换你的int
至double
要从f()
课程明确调用base
,您可以这样做:dd.base::f(i);
答案 3 :(得分:0)
以下称为覆盖
class baseClass
{
public:
virtual void DoIt()
{//.........
}
}
class child : public baseClass
{
void DoIt()
{
baseClass::DoIt();
}
}
在microsoft visual C ++中 您可以使用 _ super 而不是基类名称 _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;
}
};