C++ 学习笔记----继承篇
(一)基本概念和语法
1、术语:父类(基类)、子类(派生类)、单继承、多继承;
2、一个继承实例:(默认继承方式是private)
1 //类BC继承自DC 2 class BC : public DC { 3 //........ 4 };
3、继承机制下的私有成员:
基类的私有成员可以有派生类继承,但对派生类是不可见的;
4、改变访问方式:
使用 using 可以改变成员在派生类中的访问限制;例如:基类的公有成员可以在派生类中使用 using 将其改为私有成员;
1 class DC { 2 public : 3 void set_x( float a ) { x = a; } 4 private: 5 float x; 6 }; 7 8 class BC : public DC { 9 private: 10 using BC::set_x; //将set_x变为私有 11 //........... 12 };
5、名字隐藏:
派生类中的数据成员或成员函数或覆盖基类中的同名的数据成员或成员函数;
6、间接继承:
类间的间接继承;类支持多重继承;
7、保护成员:
在没有继承的情况下,保护成员和私有成员类似,只对该类可见;
在公有继承方式下,保护成员对派生类是可见的;但不能访问基类对象的保护成员,因为基类对象属于基类,不属于派生类;
1 class BC { 2 protected : 3 int get_w() const; 4 //.... 5 }; 6 7 class DC : public BC { 8 public : 9 void get_val const { return getw(); } 10 void base_w ( const BC& b ) const 11 { 12 cout<< b.get_w() << '\n'; //Error 13 } 14 }
一般来说:应该避免把类的数据成员设计成保护成员,更好的解决方案是:将这个数据成员设为私有,通过保护成员函数来进行访问;
(二)继承机制下的构造函数和析构函数
1、构造函数:
(1)基类的构造函数:当创建一个派生类对象时,基类的构造函数会被自动调用,对对象进行初始化,并完成一些其他事务,如果派生类定义了构造函数,则它对对象的“派生类添加部分”进行初始化;
(2)可以在派生类构造函数中,调用其基类的构造函数;
1 class Animal { 2 public : 3 Animal() { species = "Animal"; } 4 private : 5 string species; 6 }; 7 8 class Primate : public Animal { 9 public : 10 Primate() : Animal ( "Primate" ) { } 11 //...... 12 }
2、派生类构造函数的规则:
(1)如果基类拥有构造函数,但没有默认的构造函数,则派生类的构造函数必须显式的调用基类的某个构造函数;
因此:建议为每个基类创建一个默认的构造函数;
(2)假设基类拥有默认构造函数,其派生类也定义了一些构造函数,不过派生类的构造函数没有显式的调用基类的某个构造函数,在这种情况下,当创建一个派生类对象时,基类的默认构造函数被调用;
3、析构函数:注意调用顺序即可;
(三)多继承
1、继承和访问规则:与单继承相同;
使用多继承,将增加命名冲突出现的可能性:一是派生类和某个基类之间发生命名冲突,一是基类与基类之间发生命名冲突;
2、虚基类:使用虚基类可以解决一个类多次继承同一个基类的问题;例如:
1 class BC { 2 int x; 3 //...... 4 }; 5 class DC1 : virtual public BC { 6 //...... 7 }; 8 class DC2 : virtual public BC { 9 //...... 10 }; 11 12 class Z : public DC1, public DC2 { 13 //...... 14 };
1 //////////////////////////////////////////////////////////////////////////////// 2 //C++学习笔记 3 ////////////////////////////////////////////////////////////////////////////////