类的继承与多态性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在
派
基类中私有成员
生
类
派生类中的
中
保护成员
的
派生类中的
Biblioteka Baidu
访
公有成员
问
属
性
公有(public)继承时访问属性的变化
继承成员的访问属性
基 private私有
类 成
protected保护
员 public公有
在
派
基类中私有成员
生
类
中
派生类中的
的
保护成员
访
问
属
性
保护(protected)继承时访问属性的变化
继承成员的访问属性
不加则指的是本类成员.
返回main()函数
基类成员的初始化---例
void main()
{ B b1,b2(1,2,3);
b1.Out( );
调用类B中的 构造函数 初始化对象
b2.Out( );
cout<<b1.Sum()<<‘ ‘<<b2.Sum()<<endl;
cout<<sizeof(B)<<endl;
基类名(实参表)
• 如果初始化表中没有调用基类构造函数的显式, 系统将隐含调用基类的无参构造函数完成初始化
• 若构造函数的形参均带默认值,则它既可以接受 有参调用,又可接受无参调用
基类成员的初始化---例1
class A { int a1;
protected: int a2;
public: int a3; A(){a1=a2=a3=0;} A(int x1,int x2,int x3):a1(x1),a2(x2),a3(x3) {} void out(){ cout<<a1<<‘ ‘<<a2<<‘ ‘<<a3<<endl;} int Geta1(){return a1;}
{b1=x1+1;b2=x2+2;b3=x3+3;}
void out(){ A::out(); //两类中均有名为out的函数 cout<<b1<<‘ ‘<<b2<<‘ ‘<<b3<<endl;}
int Sum(){return Geta1() *b1+b2*b2+a3*b3;}
}; 说明:A类和B类中都有Out(),则用::界定其所属,若
派生与继承的概念
• 某事物具有
共性
与
房屋
特性
建筑物 桥梁
平房
楼房
纪念塔
办公楼
居民楼
派生与继承的概念
• 可以通过类层次来体现事物的共性与特性,位于上层的称 为基类,位于基类之下的类称为派生类;
• 具有共性的类可通过继承共同的基类来体现它们的共性; • 基类、派生类是相对的。
• 通过继承建立新类的优越性: – 通过重用已有代码,提高编程效率,降低软件开发成 本; – 更有效地保持共有特性的一致性; – 提高了系统的可维护性; – 是实现多态性的基础。
};
class CC: public AA, public BB {
int c; AA d;
public:
CC() {c=0};
CC(int x, int y, int z): AA(x), BB(y), c(z), d(x+y+z) {}
class Y2:protected X{ int d;
public: output( ){return d;}
}; Y2的构成----
不可访问:a (仍属于基类) 私有:d 保护:b c 公有:output()
继承成员的访问属性---举例
• 示例 • class X{ • private: • int a; • protected: • int b; • public: • int c; • };
};
返回B类
基类成员的初始化---例1
class B:public A{
int b1;
protected: int b2;
隐含调用A(
){}
public:
调用类A中的
int b3;
构造函数
B(){b1=b2=b3=0;} 初始化对象
显式调用 A(int,int,int)
B(int x1,int x2,int x3):A(x1,x2,x3)
}
构造函数的再讨论
class AA {
---多继承时的构造函数的调用
protected : int a;
public: AA(int x=0) : a(x) { }
int Geta() { return a;}
};
class BB {
protected: int b;
public: BB(int x=0): b(x) { }
派生类的定义
• 定义格式:
class 派生类名:基类表 {成员表 };
• 其中基类表包含一个或多个如下的基类说明(继 承方式说明):
[public/protected/private]基类名
分别表示派生类公用继承基类, 派生类保护继承基类, 派生类私有继承基类.
存储地址:基类和派生类所含的基类部分的首地址相同。
派生类的定义
• 派生类对象的构成
基
私有成员
类
派
部 分
保护成员 公有成员
派 生
生 类
新
私有成员
类
定
成
义
保护成员
员
部
分
公有成员
派生类访问基类中私有成员的方式:通过基类提供的公用或保 护成员函数间接访问或把派生定义为基类的友元再直接使用.
继承成员的访问属性
private私有 基 类 protected保护 成 员 public公有
基 private私有
类 成
protected保护
员 public公有
在
派
基类中私有成员
生
类
中
派生类中的
的
私有成员
访
问
属
性
私有(private)继承时访问属性的变化
继承成员的访问属性---举例
• 示例 class X{ private:
int a; protected:
int b; public:
int c; };
class Y1:public X{ int d; public: output( ){return d;}
}; Y1的构成-----
不可访问:a(仍属于基类) 私有:d 保护:b 公有:output() , c
继承成员的访问属性---举例
• 示例 • class X{ • private: • int a; • protected: • int b; • public: • int c; • };
class Y3:private X{ int d;
public: output( ){return d;}
}; Y3的构成----
不可访问:a (仍属于基类) 私有:d b c 保护: 公有:output()
基类成员的初始化
• 基类成员的初始化应在派生类构造函数的初始化 表中通过调用基类构造函数得以实现,格式是: