C++中关于函数的覆盖与重载。

时间:2022-10-28 19:10:36
#include <iostream.h>
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 是重载了的

#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);
#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楼的解释有待商榷。

#8


5楼的
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
    这个函数是重载  但是重载的是 派生类的 fun()函数   而不是基类的 fun()函数

#9


跟着7楼的写

重写的时候,只要函数名相同就算重写(不用管参数是否一致)。

#10


都是高手 新手刚来大家多多指教

#11


都是高手啊,学习了啊!!!

#12


1、这两个函数只能通过各自所在的类调用,准确说叫做覆盖

2、不是

#13


引用 3 楼 kuillldan 的回复:
NO1 派生类中出现与基类同名函数时,名字覆盖,此时派生类对象只能访问派生类的函数,所以 是
NO2 是重载了的


参数类型修改了……

#14


函数的覆盖:发生在父类和子类之间,函数名和参数相同,必须有virtual关键字。
重载:函数名相同,参数不同。
隐藏:派生类的函数与基类的函数同名,但参数不同。此时不论有无virtual关键字,基类的函数都被隐藏(与重载区别)。派生类的函数与基类的函数同名,参数也相同。但是基类函数没有virtual关键字,此时基类函数被隐藏(与覆盖的区别)。

#1


http://knix.blog.163.com/blog/static/295750352010123104454357/

#2


第一个:没有
第二个:是

#3


NO1 派生类中出现与基类同名函数时,名字覆盖,此时派生类对象只能访问派生类的函数,所以 是
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);
#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楼的解释有待商榷。

#8


5楼的
void fun(int x){cout<<"B::fun(int x)"<<endl;}//这个是重载,基类没有这个函数
    这个函数是重载  但是重载的是 派生类的 fun()函数   而不是基类的 fun()函数

#9


跟着7楼的写

重写的时候,只要函数名相同就算重写(不用管参数是否一致)。

#10


都是高手 新手刚来大家多多指教

#11


都是高手啊,学习了啊!!!

#12


1、这两个函数只能通过各自所在的类调用,准确说叫做覆盖

2、不是

#13


引用 3 楼 kuillldan 的回复:
NO1 派生类中出现与基类同名函数时,名字覆盖,此时派生类对象只能访问派生类的函数,所以 是
NO2 是重载了的


参数类型修改了……

#14


函数的覆盖:发生在父类和子类之间,函数名和参数相同,必须有virtual关键字。
重载:函数名相同,参数不同。
隐藏:派生类的函数与基类的函数同名,但参数不同。此时不论有无virtual关键字,基类的函数都被隐藏(与重载区别)。派生类的函数与基类的函数同名,参数也相同。但是基类函数没有virtual关键字,此时基类函数被隐藏(与覆盖的区别)。