C++ 继承(一、语法以及三种继承方式的要点)

来源:互联网 发布:斩妖伏魔录3java破解版 编辑:程序博客网 时间:2024/06/03 21:03

一、语法

   class 子类名: 继承方式1 基类名1,继承方式2 基类名2,...{
   //子类定义;
   };

二、继承的基本要点:

  1> 一个子类对象在任何时候都可以作为一个基类类型的对象,而不必使用显式类型转换,前提是两者(子类及其基类)都是通过指针或引用操作;

  2>在子类中可以直接使用基类的所有公有和保护成员,就像它们是在子类中声明的那样,但是基类的私有成员在子类中虽然存在但不可见(即不可访问它);

  3>尽管基类的公有和保护成员在子类中直接可见,但是也可以在子类中重新定义这些名字--名字隐藏.如果一定要绕过名字隐藏访问基类中的这些名字,

       可以通过作用域分解操作符"::"完成;

实例:

#include <iostream>using namespace std;class Person{public:    Person(string strName,int age):m_strName(strName),m_nAge(age){} private:    string m_strName;    int m_nAge;};class Student:public Person{public:    Student(string strName,int age,int nNum):Person(strName,age),m_nNum(nNum){}private:    int m_nNum;};int main(void){    return 0;}

解析1:一个子类对象在任何时候都可以作为一个基类类型的对象,而不必使用显式类型转换,前提是两者(子类及其基类)都是通过指针或引用操作

  Student*pStu = new Student("test01",10,01);  Person*pPer = pStu;
  // 反过来就出现错 必须使用显示类型转换  Person*pPer = new Person("test01",10);  //    Student*pStu = pPer;  Student*pStu = static_cast<Student*>(pPer); // 转换成功 但是存在风险  
  Person*pPer  = new Student("test01",10,01);    Student*pStu = static_cast<Student*>(pPer);  // pStu 是安全的,因为它实际指向就是子类对象

解析2:继承方式

对于公有继承方式

(1) 基类成员对其对象的可见性:

公有成员可见,其他不可见。这里保护成员同于私有成员。

(2) 基类成员对派生类的可见性:

公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。

(3) 基类成员对派生类对象的可见性:

公有成员可见,其他成员不可见。

所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。这里,一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是不同的。

对于私有继承方式

(1) 基类成员对其对象的可见性:

公有成员可见,其他成员不可见。

(2) 基类成员对派生类的可见性:

公有成员和保护成员是可见的,而私有成员是不可见的。

(3) 基类成员对派生类对象的可见性:

所有成员都是不可见的。

所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

对于保护继承方式

这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,对基类成员有不同的可见性。

上述所说的可见性也就是可访问性。

关于可访问性还有另的一种说法。这种规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。

总结:(区分类中、类外部使用的区别)

 类成员的访问控制
  访问限定符 访控属性 基类   子类   外部  友元
  public            公有         OK      OK      OK   OK
  protected      保护         OK      OK      NO   OK
  private           私有         OK      NO      NO   OK

解析3:

class A{void foo(int n){...}};class B:public A{void foo(double f){...}void bar(void){foo(3.14);   //调用B::foo()A::foo(10);  //调用A::foo()}};
B b;b.foo();     //调用B::foo();b.A::foo();  //调用A::foo();


三、子类的构造函数和析构函数

四、子类的拷贝构造函数和拷贝赋值函数

五、子类的操作符重载

六、多重继承

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卵巢早衰月经量少怎么办 7岁孩吃饭少消瘦怎么办 宝宝3岁不吃饭怎么办 小孩吃多了吐了怎么办 6岁儿童越来越瘦怎么办 7岁儿童不吃饭怎么办 天热宝宝不好好吃饭怎么办 天热宝宝不爱吃饭怎么办 天热宝宝不想吃饭怎么办 夏天天热宝宝不爱吃饭怎么办 3岁宝宝吃饭不香怎么办 胃ca吃饭反胃没食欲怎么办 12岁儿童脸色发黄怎么办 胃饿 但是没食欲不想吃饭怎么办 牙缝大经常塞西怎么办 吃肉老是塞牙缝怎么办 宝宝光喝奶粉不吃饭怎么办 九个月宝宝缺维c怎么办 九个月宝宝缺维d怎么办 9个月大宝宝缺锌怎么办 三周岁宝宝不爱吃饭怎么办 一周岁宝宝不爱吃饭怎么办 两岁半宝宝不自己吃饭怎么办 3岁宝宝不会吃饭怎么办 节食减肥胃疼怎么办呢 减肥不吃饭胃疼怎么办 过度节食伤了胃怎么办 3岁宝宝啥也不吃怎么办 1岁多宝宝不吃饭怎么办 胃口吃辣的难受怎么办 空腹吃辣椒胃疼怎么办 吃东西辣的胃口疼怎么办 吃辣的东西胃烧怎么办 吃母乳的宝宝不爱喝水怎么办 三个月宝宝不肯吃奶粉怎么办 三个月宝宝不肯喝奶粉怎么办 三个月的宝宝不肯喝奶粉怎么办 三个月的宝宝不肯吃奶粉怎么办 饿了还是没食欲怎么办 3岁半幼儿便秘怎么办 小孩字写得难看怎么办