class Base
{
public:
void f(int x)
{
cout<<"gyf"<<endl;
}
};
class Derived : public Base
{
public:
void f(char *str)
{
}
void f(int n)
{
Base::f(n);
}
};
void main()
{
Derived *pd = new Derived;
pd->f(10);
}
请问高手Derived类中的f(char *str)和f(int n)是不是都屏蔽了Base类中的f(int x)函数?而Derived 中的f(char *str)和f(int n)是不是重载函数?请高手分别回答我这两个问题,不要太简单。
14 个解决方案
#1
http://knix.blog.163.com/blog/static/295750352010123104454357/
#2
第一个:没有
第二个:是
第二个:是
#3
NO1 派生类中出现与基类同名函数时,名字覆盖,此时派生类对象只能访问派生类的函数,所以 是
NO2 是重载了的
NO2 是重载了的
#4
override,polymorphism,upcasting……
我已经晕了
我已经晕了
#5
#include <iostream>
using namespace std;
class A{
public:
A(){}
virtual ~A(){cout<<"~A()"<<endl;}
void fun(){cout<<"A::fun()"<<endl;}
};
class B:public A{
public:
B(){}
~B(){cout<<"~B()"<<endl;}
void fun(){cout<<"B::fun()"<<endl;} //这个fun()重写了基类的fun()函数,属于覆盖了
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
};
int main( )
{
B b;
b.fun(); //这里调用子类中的成员函数fun()
b.A::fun();//这里调用父类中的成员函数fun()
b.fun(1); //调用子类函数fun(int),因为父类没有该函数,因此不能使用b.A::fun(1)
return 0;
}
#6
1、这种情况叫隐藏(遮掩)具体可以看《Effective C++》条款33:避免遮掩继承而来的名字 P156,你可以在Derived的定义中直接加上using Base::f;使其在Derived中可以见,或者在对象调用时,加上作用域:pd->Base::f(10);
2、Derived 中的f(char *str)是重载函数、而Derived 中的f(int n)不是
#include <iostream>
using namespace std;
class Base
{
public:
void f(int x)
{
cout << "int" << endl;
}
};
class Derived : public Base
{
public:
using Base::f;
void f(char *str){cout << "char*" << endl;}
};
int main()
{
Derived *pd = new Derived;
pd->f(10);
delete pd;
return 0;
}
2、Derived 中的f(char *str)是重载函数、而Derived 中的f(int n)不是
#7
我有话要说
“重载必须是同一个作用域的函数”
不同作用域的同名函数不算重载。
不同作用域的同名函数是重写。
注意重载和重写的区别。
5楼的解释有待商榷。
“重载必须是同一个作用域的函数”
不同作用域的同名函数不算重载。
不同作用域的同名函数是重写。
注意重载和重写的区别。
5楼的解释有待商榷。
#8
5楼的
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
这个函数是重载 但是重载的是 派生类的 fun()函数 而不是基类的 fun()函数
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
这个函数是重载 但是重载的是 派生类的 fun()函数 而不是基类的 fun()函数
#9
跟着7楼的写
重写的时候,只要函数名相同就算重写(不用管参数是否一致)。
重写的时候,只要函数名相同就算重写(不用管参数是否一致)。
#10
都是高手 新手刚来大家多多指教
#11
都是高手啊,学习了啊!!!
#12
1、这两个函数只能通过各自所在的类调用,准确说叫做覆盖
2、不是
2、不是
#13
参数类型修改了……
#14
函数的覆盖:发生在父类和子类之间,函数名和参数相同,必须有virtual关键字。
重载:函数名相同,参数不同。
隐藏:派生类的函数与基类的函数同名,但参数不同。此时不论有无virtual关键字,基类的函数都被隐藏(与重载区别)。派生类的函数与基类的函数同名,参数也相同。但是基类函数没有virtual关键字,此时基类函数被隐藏(与覆盖的区别)。
重载:函数名相同,参数不同。
隐藏:派生类的函数与基类的函数同名,但参数不同。此时不论有无virtual关键字,基类的函数都被隐藏(与重载区别)。派生类的函数与基类的函数同名,参数也相同。但是基类函数没有virtual关键字,此时基类函数被隐藏(与覆盖的区别)。
#1
http://knix.blog.163.com/blog/static/295750352010123104454357/
#2
第一个:没有
第二个:是
第二个:是
#3
NO1 派生类中出现与基类同名函数时,名字覆盖,此时派生类对象只能访问派生类的函数,所以 是
NO2 是重载了的
NO2 是重载了的
#4
override,polymorphism,upcasting……
我已经晕了
我已经晕了
#5
#include <iostream>
using namespace std;
class A{
public:
A(){}
virtual ~A(){cout<<"~A()"<<endl;}
void fun(){cout<<"A::fun()"<<endl;}
};
class B:public A{
public:
B(){}
~B(){cout<<"~B()"<<endl;}
void fun(){cout<<"B::fun()"<<endl;} //这个fun()重写了基类的fun()函数,属于覆盖了
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
};
int main( )
{
B b;
b.fun(); //这里调用子类中的成员函数fun()
b.A::fun();//这里调用父类中的成员函数fun()
b.fun(1); //调用子类函数fun(int),因为父类没有该函数,因此不能使用b.A::fun(1)
return 0;
}
#6
1、这种情况叫隐藏(遮掩)具体可以看《Effective C++》条款33:避免遮掩继承而来的名字 P156,你可以在Derived的定义中直接加上using Base::f;使其在Derived中可以见,或者在对象调用时,加上作用域:pd->Base::f(10);
2、Derived 中的f(char *str)是重载函数、而Derived 中的f(int n)不是
#include <iostream>
using namespace std;
class Base
{
public:
void f(int x)
{
cout << "int" << endl;
}
};
class Derived : public Base
{
public:
using Base::f;
void f(char *str){cout << "char*" << endl;}
};
int main()
{
Derived *pd = new Derived;
pd->f(10);
delete pd;
return 0;
}
2、Derived 中的f(char *str)是重载函数、而Derived 中的f(int n)不是
#7
我有话要说
“重载必须是同一个作用域的函数”
不同作用域的同名函数不算重载。
不同作用域的同名函数是重写。
注意重载和重写的区别。
5楼的解释有待商榷。
“重载必须是同一个作用域的函数”
不同作用域的同名函数不算重载。
不同作用域的同名函数是重写。
注意重载和重写的区别。
5楼的解释有待商榷。
#8
5楼的
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
这个函数是重载 但是重载的是 派生类的 fun()函数 而不是基类的 fun()函数
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
这个函数是重载 但是重载的是 派生类的 fun()函数 而不是基类的 fun()函数
#9
跟着7楼的写
重写的时候,只要函数名相同就算重写(不用管参数是否一致)。
重写的时候,只要函数名相同就算重写(不用管参数是否一致)。
#10
都是高手 新手刚来大家多多指教
#11
都是高手啊,学习了啊!!!
#12
1、这两个函数只能通过各自所在的类调用,准确说叫做覆盖
2、不是
2、不是
#13
参数类型修改了……
#14
函数的覆盖:发生在父类和子类之间,函数名和参数相同,必须有virtual关键字。
重载:函数名相同,参数不同。
隐藏:派生类的函数与基类的函数同名,但参数不同。此时不论有无virtual关键字,基类的函数都被隐藏(与重载区别)。派生类的函数与基类的函数同名,参数也相同。但是基类函数没有virtual关键字,此时基类函数被隐藏(与覆盖的区别)。
重载:函数名相同,参数不同。
隐藏:派生类的函数与基类的函数同名,但参数不同。此时不论有无virtual关键字,基类的函数都被隐藏(与重载区别)。派生类的函数与基类的函数同名,参数也相同。但是基类函数没有virtual关键字,此时基类函数被隐藏(与覆盖的区别)。