科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件『21天精通C++』第三周学习笔记(3-1)

『21天精通C++』第三周学习笔记(3-1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

从已存在的类继承得到新类的过程叫做派生。派生是继承的过程。 用:将派生类和基类分开。

作者:雷神 来源:中国软件网 2008年3月31日

关键字: 笔记 精通 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

第十五天和第十六天

  从已存在的类继承得到新类的过程叫做派生。派生是继承的过程。
用:将派生类和基类分开。派生类将继承基类所有公有成员。(构造函数和析构函数除外)
不要设计有许多私有成员的基类。

protected:被保护成员,可以被基类和派生类使用。通常基类只包括公有和被保护成员。
如果希望类外程序包括派生类都无权访问类中数据,那么将其定义为私有。

class base:private emp//取代继承时VC++提供的缺省设置方式是private.即是从基类继承到的成员在派生类全都是私有成员。

class base:protected emp//继承来的保护成员和公有成员在派生类中全部都为被保护成员。

最常用的是这种:
class base:public emp//基类中的保护成员在派生类仍旧为保护成员,基类中的公有成员在派生类中仍旧为公有成员。

  内部的缺省构造函数没有处理常量的能力。因此要求类中出现常量成员时需要自定义构造函数。并且需要利用构造初始化表,构造函数才能真正的进行构造和初始化,而不是构造和赋值。

class c{
int i;
char a;
float b;
public:
c(int i,char a,float b)://此处时冒号,构造函数原型声明,可以和初始化表在一行。
i(I),a(A),b(B){};//此处是初始化表
}

注意:字符数组成员和指针通常被保存在堆中,故要求在函数内赋值。
类中没有数组成员时,应当用构造初始化表完成所有初始化工作。

为什么要用继承:

  通过继承再次利用了自己编写的代码,既维持了对数据的保护,又是开发程序的有利工具。如果买来了类工具库,甚至可以在没有实现部分源代码的情况下派生出新的类来,当需要得到一个和类库所提供的不同的窗口类时,可通过继承得到一个略有不同的新窗口。

  继承的一个优点是可以在已经了解的编写好的代码基础上编写新的代码,从已经编写并调试好的类中很容易就能够派生出新的类。通过继承复用代码和数据,比非OOP程序设计中的复用更加安全有效。

被保护的访问权限用在何处?

  在VC++添加被保护的访问权限是为了在维持对数据保护的情况下完成继承。派生类不能使用基类中的私有成员。
  将基类中的某些成员定义为保护成员防止了类外的程序对其的访问,同时又允许派生类访问,被保护的成员仍旧不被余下程序所见,但所有的派生类都可以访问它。如果没有被保护访问权限就不能做到既对数据进行保护(私有性)又可以使派生类可以访问。
由一个基类得到派生类可以做那些改动。
  可以在派生类添加数据成员和功能函数。子类总是比父类功能强大。

为什么单向继承优于多向继承?

  单向继承代码比多向继承代码易于编写,可以加快编程速度并可减少错误。

为什么派生类必须定义访问权限?

  因为在VC++中所有的派生类继承基类时缺省为私有继承。这种限制会带来不便。
  将访问权限定义为protected将使得继承得到的公有成员和保护成员在派生类中都是保护成员。
  将访问权限定义为public将使得继承得到的公有成员仍为公有成员,保护成员仍为保护成员,这是最通用的方式。

  用构造初始化表后,除了能构造常量成员对象外,还可以使构造函数变的简捷,构造初始化表负责构造派生类。
  字符数组必须在函数体内被赋值。字符数组成员和指针成员通常被保存在堆中故而要求在构造函数体内赋值。


 

[下一页]


 

例子程序:

#include
#include
class Parent{
protected:
char name[25];
int age;
public:
Parent(char[],int);
~Parent(){};
void disparent(void);
};
Parent::Parent(char N[],int A):age(A){
strcpy(name,N);
}
void Parent::disparent (void){
cout<<"Parent''s name is:"< cout<<"Parent''s age is:"< }
class Son:Parent{
int yrInSchool;
public:
void dispSon(void);
Son(char[],int,int);
};
Son::Son(char N[],int A,int Y):Parent(N,A),yrInSchool(Y){
}
void Son::dispSon (void){
cout<<"Son''s name is:"< cout<<"Son''s age is:"< cout<<"Son year IN school is:"< }
class Daughter:Parent{
int yrInSchool;
char friendsName[25];
public:
void dispDaughter(void);
Daughter(char[],int,int,char[]);
};
Daughter::Daughter(char N[],int A,int Y,char F[]):Parent(N,A),yrInSchool(Y)
{
strcpy(friendsName,F);
}
void Daughter::dispDaughter (void){
cout<<"Daughter''s name is:"< cout<<"Daughter''s age is:"< cout<<"Daughter year IN school is:"< cout<<"Daughter''s FriendsName is:"< };

main(){
Parent mom("Betty",58);
Parent dad("tom",60);
mom.disparent ();
dad.disparent ();
Son boy("smalltom",17,11);
boy.dispSon ();
Daughter girl("ketey",18,12,"june");
girl.dispDaughter ();
return 0;
}

  子类构造基类时,初始化表的参数顺序和父类的初始化表一致。这样才能将正确的值传递给父类的构造函数。
  先构造基类对象在构造派生类对象。
  如果需要限制或改变继承到成员的功能,在派生类中定义同名的数据成员或成员函数。
  VC++自动析构继承对象从最低的派生类到基类。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章