《C++从入门到精通》实例--父子之间——继承

      《C++从入门到精通》实例--父子之间——继承

//范例1:继承语法应用
//知识点:类的继承
//2018.3.25

#include <iostream>
#include <string>
using namespace std;           //using指令,全局范围内声明的

class twopoint                 //二维空间坐标点类的定义
{
protected:
	double x, y;               //定义保护变量x、y
public:
	twopoint(double i, double j) :x(i), y(j){}   //构造函数定义
	//下面是成员函数定义
	void setX(double NewX){ x = NewX; }
	void setY(double NewY){ y = NewY; }
	double getX() const{ return x; }
	double getY() const { return y; }
};
class threepoint :public twopoint   //使用继承定义三维空间点类
{
private:
	double z;                      //定义私有变量
public:
	//构造函数复用twopoint类的构造函数,并通过成员初始化将值传送到twopoint类的构造函数
	//twopoint的构造函数用在threepoint的构造函数的初始化列表中,说明基类的数据成员先初始化。基类的构造函数和析构函数不能被派生类继承。
	//每一个类都有自己的构造函数和析构函数,如果用户没有显式定义,编译器则会隐式定义默认的构造函数和析构函数
	threepoint(double i, double j, double k) :twopoint(i, j){ z = k; }
	void setZ(double NewZ){ z = NewZ; }       //成员函数定义
	double getZ() const { return z; }
};

int main(int argc, char* argv[])
{
	threepoint d3(1, 2, 3);    //创建派生类对象
	cout << "三维对象的坐标是:" << endl;
	cout << d3.getX() << "," << d3.getY() << "," << d3.getZ() << endl;
	system("pause");
	return 0;
}
//范例2:继承应用例子
//知识点:类的继承
//2018.3.25

#include <iostream>
#include <string>
using namespace std;           //using指令,全局范围内声明的

class A                        //类的定义
{
private:                       //私有变量
	int x;
public:                        //公有成员函数
	void Setx(int i){ x = i; }  //私有变量x赋值
	void Showx(){ cout << x << endl; } //输出私有变量x值
};
class B :public A                //类A是类B的基类,继承方式是公有继承
{
private:                         //类B的私有变量
	int y;
public:
	void Sety(int i){ y = i; }
	void Showy()
	{
		Showx();                 //调用基类的成员函数
		cout << y << endl;
	}
};
int main(int argc, char* argv[])
{
	B b;                         //创建对象b
	b.Setx(10);                  //调用对象b基类的成员函数
	b.Sety(20);                  //调用对象b的成员函数
	b.Showy();                   //调用对象b的成员函数
	system("pause");
	return 0;
}
/*注意:派生类以公有继承方式继承了基类,并不说明派生类可以访问基类的private成员。
  例如,若将上述程序中派生类B的Showy()函数的实现改写为如下形式是不正确的。
void B::Showy()
{
	cout << x << "," << y << endl;
}
*/
//范例3:多重继承的二义性
//知识点:多重继承
//2018.3.25

#include <iostream>
#include <string>
using namespace std;           //using指令,全局范围内声明的

class A
{
public:
	virtual void fun1(){}     //定义虚函数func1
};
class X :public A              //定义派生类X继承于类A
{
public:
	virtual void fun1(){}     //定义虚函数func1
};
class Y :public A              //定义派生类Y继承于类A
{
public:
	virtual void fun1(){}     //定义虚函数func1
};
class Z :public X, public Y     //类Z继承于类X和类Y
{

};
int main(int argc, char* argv[])
{
	Z *obj = new Z();          //创建指针对象
	//obj->fun1();            //错误
	obj->X::fun1();           //正确,明确指定调用X的成员函数
	system("pause");
	return 0;
}




注意:

1.C++初始化函数列表

2.C++建立派生类对象时,派生类构造函数的调用顺序

  (1)执行基类的构造函数

  (2)执行成员对象的构造函数(如果有的话)

  (3)执行派生类的构造函数

3.C++ 多重继承歧义及其解决办法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值