…… void show 什么都不是 谢谢。
关于继承和派生的问题:首先这是两个动词:派生的意思是扩展,继承的意思就是复制。无论是派生还是继承都是指一个事情,不过派生是从父类的角度来看,继承是从子类的角度来看的。
父类(基类/超类superclass )与子类(派生类)的关系其实是很单纯的。子类可以完成父类的所有功能,如果不使用virtual关键字定义方法,那么子类完全可以当做父类使用,而不用考虑出现任何差错。 子类可以完成部分父类不可以完成的工作,这就是继承(派生)的意义所在。
当使用virtual关键字定义方法时,每一个父类都会维护一个虚函数列表的东西。
class base{
public:
virtual void test()=0;
/*virtual */ int create(){cout<<"hello "<
int value;
};
class sub:public base {
public:
void test(){}
void c(){cout<<"different"<
int str;
};
其中的create函数被声明为虚函数,每个继承base的子类都应该重载该函数(其实是覆盖而已)。
如下操作;
base * hel=new sub(20);
sub obj(10);
hel->create();
// hel->c(); //error for undifined method in base
obj.create();
使用了父类型的指针执行子类实例,完全放心表现不会出现差别。只有create函数定义为虚函数 会出现表现的不同。结果如下:
hello
bye
很明显 正如我们期待的,sub变成了base;
如果使用vitural ,就会如下
bye
bye
子类还是子类。虽然指针是父类型指针。
尝试使用父类hel->c() 调用子类专有的方法的话,通不过编译的。 原因是通不过编译器的类型检查,从理念上来讲是;既然程序期望的是父类型,就不应该使用期望类型以外的方法被使用。
派生类就是在基类的基础上构建的类, 可以节约很多代码
比如
class Man // 类型 "人"
{
public:
int HP; // 生命
int MP; // 魔力
void Run(); // 动作 - 跑步
void Jump(); // 动作 - 跳
//// 各种其他成员数据
};
现在我们需要一个新的类, SuperMan 超人
还需要重新定义一个全新的类, 加上 生命, 魔力, 跑, 跳之类的吗? 多麻烦啊
只要继承就好了
class SuperMan
public : Man // 继承Man
{
public:
void Fly(); // 超人独有技能 - 飞
};
就这么简单, 像 HP, MP, Run 之类的编译器会偷偷帮你加上
SuperMan sm;
sm.Run(); /// 虽然你没有定义SuperMan的Run, 但是由于继承的原因, Super自动包含这个函数
sm.Jump();
至于动态绑定, LZ既然问到上面的问题, 那么估计还没学到, 我就不罗嗦了
void Show --- 一个叫Show的函数, 不返回任何数据, void是没有类型的意思
对问题结果进行显示,当然函数名是可以改的