论C++继承

C++继承

1;定义:

类的继承,是新的类从已有类那里获得的已有的特性。由原有的类产生新类时,新类便包含了原有的类的特征,同时也可以加入自己所有的新特性。原有的类称为基类和父类,产生的新类称为子类和派生类。

定义语法为:

class 派生类:继承方式 基类名1,继承方式 基类名2,······

eg:

class Base{

public;

int a=2;

};

class Derived:public Base{

public;

int b=3;

};

使用继承的目的和作用:使代码看起来更加的简洁。

2:继承的三大分类

1:公有继承

2:私有继承

3:保护继承

1;公共继承;当类的继承方式为此时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。
2;私有继承:当类的继承方式为此时,基类中的公有成员和保护成员都以私有成员的身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。
3:保护继承;基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。

3;类型兼容规则:

在任何需要基类对象的任何地方,都可以使用公有派生类的对象来替代,在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
class B{.....}

class D:public B{.....}  

B b1,*pb1;

D d1;

替代情况:

1;派生类的对象可以隐含转换为基类对象

b1=d1;

2;派生类的对象可以初始化基类的引用

B &rb=d1;

3;派生类的对象可以隐含转化为基类的指针

pb1=&d1;

4:派生类的构造和析构函数

1:构造函数

注意事项:

1;构造派生类的对象时,就要对基类的成员对象和新增成员对象进行初始化

2:如果对基类初始化时,需要调用基类的带有形参表的构造函数时,就必须要声明构造函数

eg:

#include <iostream>
using namespace std;

class Base{
	public:
		Base(){
		        cout << "Base的构造函数" << endl;
		}
};
class Derived:public Base{
	public:
    Derived(){
        cout << "Derived的构造函数" << endl;
    }
};

int main()
{
    Derived s;
}

1570974351864

原则:先构造父类,再构造成员变量、最后构造自己
2:析构函数

注意事项:

在派生过程中,基类的析构函数也不能继承下来,如果需要析构的话,就要在派生类中声明新的析构函数。

eg:

#include <iostream>
using namespace std;

class Base{
	public:
	~Base(){
        cout << "Base的析构函数" << endl;
    }
};
class Derived:public Base{
	public:
     ~Derived(){
        cout << "Derived的析构函数" << endl;
    }
};

int main()
{
    Derived s;
}

1570974302915

原则:先析构自己,在析构成员变量、最后析构父类。
综上可以看出,构造和析构的顺序是不同的。

5:继承中的派生类成员的标识和访问

注意事项;

1:在继承体系中基类和派生类都有独立的作用域。
2:子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫“隐藏”,也叫“重定义”(在子类成员函数中,可以使用 基类::基类成员 显示访问 )
3:需要注意的是如果成员函数的隐藏,只需要函数名相同就构成了隐藏。:

4: 在实际工程中,继承体系里最好不要定义同名成员。

eg:

class Person
{
protected:
    string _name ="小明"; //姓名
    int _num = 513030; //身份证号
};
class Student :public Person
{
public:
    void Print(){
        cout << "姓名: " << _name << endl;
        cout << "身份证: " << Person::_num << endl;
        cout << "学号: " << _num << endl;
    }
protected:
    int _num = 001; //学号
};

void Test()
{
    Student s1;
    s1.Print();
}

6;继承中的多继承

通常来说,一个子类只有一个父类,然而多继承是指一个子类有多个父类。

eg:多继承同名隐藏

#include <iostream>
using namespace std;

class Base0{
	public:
		int var0;
		void fun0()
		{
			 cout <<"Member of Base0"<< endl;
		 } 
	};
class Base1:public Base0
{
		public:
		int var1;
};
class Base2:public Base0
{
		public:
		int var2;
};
class Derived:public Base1,public Base2{
	public:
    int var;
    void fun()
		{
			 cout <<"Member of Derived"<< endl;
		 } 
};

int main()
{
    Derived s;
    s.Base1::var0=2;
    s.Base1::fun0();
	s.Base2::var0=3;
	s.Base2::fun0();
	return 0;
}

1570976249214

posted @ 2019-10-13 22:19  木有兮  阅读(139)  评论(0编辑  收藏  举报