《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)执行基类的构造函数
(2)执行成员对象的构造函数(如果有的话)
(3)执行派生类的构造函数