C++学习 2018-11-26
1.继承
1.继承是指将父类的内容拷贝一份到子类中
2.语法:
class CChina:public CPerson
派生类(子类) 基类(父类)
3.继承的作用
继承是为了提升复用的。
4.派生类的大小
父类的大小 + 自己的大小
5.同名成员
基类与派生类中有同名的成员时,通过作用域来区分(调用)相同的成员
class CFather
{
public:
int n_num;
};
class CSon:public CFather
{
public:
int n_num;
};
int main()
{
CSon son;
son.n_num = 100; // 将 CSon 中的成员属性赋值为100
son.CFather::n_num = 200; // 将 CFather 中的成员属性赋值为200
return 0;
}
6.创建一个父类、一个子类,修改子类中继承的父类的成员,父类对象中的该成员不变。
son.CFather::n_num = 10; // father.n_num 原来是多少,现在还是多少,不改变
7.继承方式
1.无论什么继承方式,基类中的 private 都是不可访问的;
class CFather
{
private:
int f_n_age;
};
class CSon:public(private、protected) CFather
{
public:
void Show()
{
cout << f_n_age << endl; // 会出错,因为无法读取得 private 的成员
}
};
2.public继承:public的成员不变,protected的成员不变,private的成员变成不可访问。
3.protected继承:public的成员变成protected,protected的成员不变,private的成员变成不可访问。
4.private继承:public的成员变成private,protected的成员变成private,private的成员变成不可访问。
5.以上所有继承方式都可以进行验证(可通过一次继承与多次继承进行验证)。
8.继承的构造与析构
1.先执行父类的构造,再执行子类的构造,再执行子类的析构,再执行父类的析构(类似于栈,先进后出FILO)。
class CFather
{
public:
CFather()
{
cout << "CFather()" << endl;
}
~CFather()
{
cout << "~CFather()" << endl;
}
};
class CSon:public CFather
{
public:
CSon()
{
cout << "CSon()" << endl;
}
~CSon()
{
cout << "~CSon()" << endl;
}
};
int main()
{
CSon son;
return 0;
}
结果为:CFather() CSon() ~CSon() ~CFather()
2.在一个类B中的成员属性包含另一个类A的对象,A的析构函数有参数,则执行B类的构造函数时必须在初始化列表中指定A的构造函数。
class CFather
{
public:
CFather(){}
~CFather(){}
};
class CSon:public CFather
{
public:
CFather father;
public:
CSon():CFather(123){}
~CSon(){}
};
3.在自己类中成员属性不能定义自己类的对象,但是在成员函数中可以定义自己类的对象。
9.父类指针 指向 子类对象
1.因为子类对象是由 父类+子类 构成的,因此父类指针是可以指向子类对象的。
class CFather
{
};
class CSon:public CFather
{
};
CSon son;
CFather *p_father = &son;
2.优点:同一类型,提高复用性
缺点:只能用父类的成员,不能用子类的成员。
解决方法:多态
2.多态
1.多态的例子
1.在父类中声明一个virtual函数(虚函数),在子类中重写(函数名、返回值与父类的成员函数完全一样)父类函数,之后通过调用父类的成员函数就可以调用子类的成员函数。
2.虚函数:virtual
作用:允许用父类的指针使用子类的成员函数。
class CTraffic
{
public:
virtual void Run()
{
cout << "CTraffic::Run()" << endl;
}
};
class CCar:public CTraffic
{
public:
void Run()
{
cout << "CCar::Run()" << endl;
}
};
class CPlane:public CTraffic
{
public:
void Run()
{
cout << "CPlane::Run()" << endl;
}
};
class CBus:public CTraffic
{
public:
void Run()
{
cout << "CBus::Run()" << endl;
}
};
class CPerson
{
public:
void Visit(CTraffic *traf)
{
cout << "Les't GO";
traf->Run();
}
};
int main()
{
CCar *car = new CCar;
CPlane *plane = new CPlane;
CBus *bus = new CBus;
CPerson xiaoming;
xiaoming.Visit(car);
xiaoming.Visit(bus);
xiaoming.Visit(plane);
system("pause");
return 0;
}