作者在 2007-04-17 23:28:00 发布以下内容
网上的关于重载、覆盖和隐藏到处都搜得到,但发现讲的都是什么是什么方式,并没有细讲到每一个要点,还有最近几个论坛发现有些人问这方面的问题,便写了一下自己的关点,供初学者学习.下面我们来讨论一下.
[以下内容由作者stylev原创,如有转载,请注明]
--------------------------------------------------------------------------------------------------------------------------
重载(overload)
这个好理解,在同个space域同名的.
参数必须不同,有关virtual无关.
--------------------------------------------------------------------------------------------------------------------------
覆盖(override)
同名字,同参数,有virtual
覆盖好理解比如show()函数
A派生了B
如果B中的show()覆盖了A中的show()
但B中仍然有两个show(),而不管是A类指针也好,B类对象调用也好,都只能调用B类自己的那个show();
而从A类继承过来的show()函数真的就被覆盖了,没有了吗? 答应是不对的.这时可以在B类对象显示的调用A类继承过来的show();
程序代码:
#include <iostream>
using namespace std;
class A
{
public:
virtual void show()
{
cout << a << endl;
}
int a;
};
class B:public A
{
public:
void show()
{
A::show();
//显示的调用自己类中的 "由A类继承过来的show()函数"
//像这种直接显示指出某个类的某个函数时,
//编译器处理方式是这样的: 首先在自己类中找有没有A::show(),如果找到,调用.不在继续在A类中找
//如果找不到,则在显示指出的那个类中(即A类)调用那个函数. 这里当然是在B类中可以找到A::show()
//因为基类中指出了这个函数是virtual函数.
}
int b;
};
int main()
{
A a;
a.a = 3;
a.show();
B b;
b.b = 4;
b.show();
b.A::show();&n
#include <iostream>
using namespace std;
class A
{
public:
virtual void show()
{
cout << a << endl;
}
int a;
};
class B:public A
{
public:
void show()
{
A::show();
//显示的调用自己类中的 "由A类继承过来的show()函数"
//像这种直接显示指出某个类的某个函数时,
//编译器处理方式是这样的: 首先在自己类中找有没有A::show(),如果找到,调用.不在继续在A类中找
//如果找不到,则在显示指出的那个类中(即A类)调用那个函数. 这里当然是在B类中可以找到A::show()
//因为基类中指出了这个函数是virtual函数.
}
int b;
};
int main()
{
A a;
a.a = 3;
a.show();
B b;
b.b = 4;
b.show();
b.A::show();&n