c++子父类的函数掩藏和覆盖的区别
c++子父类的函数隐藏和覆盖的区别
在看《高质量c/c++》中看到了函数的隐藏和覆盖是这么说的:
覆盖的是指子类函数覆盖基类函数
在不同的类内(分别位于子类和父类)。
同名同参。
基类的函数名前必须有virtual关键字。
隐藏指派生类的函数隐藏了基类的同名函数
如果派生类函数与基类函数同名,但参数不同,无论基类函数前是否有virtual修饰,基类函数被隐.
如果派生类函数与基类函数同名,参数也相同,但是基类函数前无virtual修饰,基类函数被隐藏。
Derived::f(float x)函数覆盖了基类Base::f(float x)函数。子父类同名同参,父类有virtual关键字
Derived::g(int x) 函数隐藏了基类Base::g(float x)函数。同名不同参,无论有无virtual修饰
Derived::f(float x)函数隐藏了基类Base::f(float x)函数。同名同参,且基类无virtulal修饰
------解决方案--------------------
我可以给你说说我的理解
我认为隐藏和覆盖的区别主要体现在 多态上
举个例子
[code=C/C++][/code]
#include<iostream>
#include<string>
using namespace std;
class A
{
public :
A(){}
void f(){cout<<'a'<<endl;}
virtual void g(){cout<<"invoke aaa"<<endl;}
};
class B:public A
{
public:
B(){}
virtual void g(){cout<<"invoke bbb"<<endl;}
void f(){cout<<'b'<<endl;}
};
int main()
{
A * a = new B;
A * b = new A;
B * c = new B;
a->f();
b->f();
c->f();
cout<<"-------------------------"<<endl;
a->g();
b->g();
c->g();
}
结果是
a
a
b
invoke bbb
invoke aaa
invoke bbb
我想说的是 如果是隐藏的话 当你通过指针调用这个函数的时候,调用根据的是指针的类型
如果是覆盖的话 当你通过指针调用这个函数的时候,根据的是指针指向的类型
这就是我的理解 希望对你有用
在看《高质量c/c++》中看到了函数的隐藏和覆盖是这么说的:
覆盖的是指子类函数覆盖基类函数
在不同的类内(分别位于子类和父类)。
同名同参。
基类的函数名前必须有virtual关键字。
隐藏指派生类的函数隐藏了基类的同名函数
如果派生类函数与基类函数同名,但参数不同,无论基类函数前是否有virtual修饰,基类函数被隐.
如果派生类函数与基类函数同名,参数也相同,但是基类函数前无virtual修饰,基类函数被隐藏。
- C/C++ code
class Base { public: virtual void f(float x){ cout << "Base::f(float) " << x << endl; } void g(float x){ cout << "Base::g(float) " << x << endl; } void h(float x){ cout << "Base::h(float) " << x << endl; } }; class Derived : public Base { public: virtual void f(float x){ cout << "Derived::f(float) " << x << endl; } void g(int x) { cout << "Derived::g(int) " << x << endl; } void h(float x){ cout << "Derived::h(float) " << x << endl; } };
Derived::f(float x)函数覆盖了基类Base::f(float x)函数。子父类同名同参,父类有virtual关键字
Derived::g(int x) 函数隐藏了基类Base::g(float x)函数。同名不同参,无论有无virtual修饰
Derived::f(float x)函数隐藏了基类Base::f(float x)函数。同名同参,且基类无virtulal修饰
------解决方案--------------------
我可以给你说说我的理解
我认为隐藏和覆盖的区别主要体现在 多态上
举个例子
[code=C/C++][/code]
#include<iostream>
#include<string>
using namespace std;
class A
{
public :
A(){}
void f(){cout<<'a'<<endl;}
virtual void g(){cout<<"invoke aaa"<<endl;}
};
class B:public A
{
public:
B(){}
virtual void g(){cout<<"invoke bbb"<<endl;}
void f(){cout<<'b'<<endl;}
};
int main()
{
A * a = new B;
A * b = new A;
B * c = new B;
a->f();
b->f();
c->f();
cout<<"-------------------------"<<endl;
a->g();
b->g();
c->g();
}
结果是
a
a
b
invoke bbb
invoke aaa
invoke bbb
我想说的是 如果是隐藏的话 当你通过指针调用这个函数的时候,调用根据的是指针的类型
如果是覆盖的话 当你通过指针调用这个函数的时候,根据的是指针指向的类型
这就是我的理解 希望对你有用