您的位置:首页 > 编程语言 > C语言/C++

c++类之继承与派生

2015-07-12 10:42 337 查看
继承与派生

我们首先通过一个程序来总结c++类中继承与派生的相关知识。继承与派生其实就是同一个概念,只是从不同角度来描绘,子类继承父类,父类派生出子类。不出牛逼了,我们直接上程序(这个程序是我从网上摘录的,比较好说明了继承与派生的一些特性)
#include <iostream>
#include <string>
using namespace std;

class C
{    
public:
	string c;
	C(){};
	C(string c);
	~C();
	void showC();
};

C::C(string c)
{
	this->c=c;
	cout<<"构造c值为"<<c<<"的对象c"<<std::endl;
}

C::~C()
{
	cout<<"清理c值为"<<c<<"的对象c"<<std::endl;
}
void C::showC()
{
	cout<<"c="<<this->c<<std::endl;
}

class D:public C
{
private:
	std::string c;//同名数据成员
	std::string d;
	C c2;
	C c3;
public:
	D(std::string d,std::string c1,std::string c2);
	~D();
	void showC();//同名成员函数
	void updateC(std::string c);
};

D::D(std::string d,std::string c2,std::string c3):c2(c2),c3(c3),C("ccc1") //参数传递给基类,也可以不写C(c1)或c(c2),那么就调用了C类中无参构造函数
{
	this->d=d;
	this->c=c2;//覆盖了基类的数据成员c,访问的是派生类的数据数据成员c
	std::cout<<"构造对象d"<<std::endl;
}

D::~D()
{
	std::cout<<"清理对象d"<<std::endl;
}

void D::showC()//同名成员函数
{
	C::showC();//显式访问基类成员函数showC();
	c2.showC();
	std::cout<<"D::c="<<c<<std::endl;//覆盖了基类的数据成员c
	std::cout<<"C::c="<<C::c<<std::endl;//显式访问基类数据成员c  这样访问数据成员c  c的访问属性必须是公有的
	std::cout<<"d="<<this->d<<std::endl;
}

void D::updateC(std::string c)
{
	C::c=c;//显式访问基类数据成员c
}

int main()
{
	{
		D d("ddd","ccc2","ccc3");
		d.showC();//访问的是派生类中函数成员showC()
		d.updateC("ccc4");
		d.showC();//同理
	}

	return 0;
}




总结:
1)派生类的数据成员由所有基类的数据成员与派生类新增的数据成员共同组成,如果派生类新增成员中包括其他类的对象,派生类的数据成员实际上还间接包括了这些对象的数据成员。

2)派生类A继承于父类B的c++语法格式

class A:[继承方式] B(基类名)
{
新增的数据成员和函数;
};

3)派生类构造函数的书写格式

派生类名(参数总表):基类名(参数子表),对象名(参数子表1),对象名(参数子表2)
{
派生类新增成员的初始化语句;
}
派生类构造函数的声明只需要派生类名(参数总表),在定义的时候需要和上面一样的格式。

4)派生类构造函数对数据成员初始化的执行顺序:首先,调用基类的构造函数;其次,调用子对象的构造函数;最后,调用派生类的构造函数。如果派生类中含有若干个子对象,调用它们构造函数的顺序与子对象在派生类中定义的顺序是一致的。最后析构的顺序与构造顺序相反。
以上的内容都是局限于单继承。。
一个派生类可能继承于两个或多个基类,那么这样的派生方法称为多基派生或多重继承。有关于多重继承的程序实例我就不列了,网上有一大把。针对于多重继承的用法总结下:
1)多重继承的声明
class 派生类名:继承方式 1 基类名1,继承方式2 基类名2 ,继承方式n 基类名n
{
派生类新增的数据成员和函数;
}
2)多重继承派生类构造函数的定义

派生类名(参数总表):基类名1(参数子表1),基类名2(参数子表2),基类名n(参数子表n)
{
派生类新增成员的初始化语句;
}
派生类构造函数中对数据成员初始化的执行顺序与单继承一样,对于同一层次的基类的构造函数的执行顺序与声明派生类时,指定各个基类的顺序一致(从左到右)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: