类之间的关系:包含、使用、继承
1)子类继承了父类的全部成员变量和成员方法(除了构造和析构之外的成员方法)
2)子类可以拥有父类没有的方法和属性
3)父类若有带参数的函数,可以将子类作为参数传递进去)
4)子类就是一种特殊的父类,子类对象可以当作父类对象使用
(儿子至少比父亲强:成员变量和方法至少比父亲多;儿子可以调用父亲的带参数函数;儿子也可以成为父亲)
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)
(protect是为家族使用)
(在项目开发中,一般用public)
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有子类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:
子类对象可以当作父类对象使用
子类对象可以直接赋值给父类对象
子类对象可以直接初始化父类对象
父类指针可以直接指向子类对象
父类引用可以直接引用子类对象
在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。
类型兼容规则是多态性的重要基础之一。
总结:子类就是特殊的父类 (base *p = &child;)
#include <cstdlib>
#include <iostream>
using namespace std;
/*
子类对象可以当作父类对象使用
子类对象可以直接赋值给父类对象
子类对象可以直接初始化父类对象
父类指针可以直接指向子类对象
父类引用可以直接引用子类对象
*/
//子类就是特殊的父类
class Parent03
{
protected:
const char* name;
public:
Parent03()
{
name = "Parent03";
}
void print()
{
cout<<"Name: "<<name<<endl;
}
};
class Child03 : public Parent03
{
protected:
int i;
public:
Child03(int i)
{
this->name = "Child2";
this->i = i;
}
};
int main()
{
Child03 child03(1000);
//分别定义父类对象 父类指针 父类引用 child
Parent03 parent = child03;
Parent03* pp = &child03;
Parent03& rp = child03;
parent.print();
pp->print();
rp.print();
system("pause");
return 0;
}
在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化
在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理
1、子类对象在创建时会首先调用父类的构造函数
2、父类构造函数执行结束后,执行子类的构造函数
3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
4、析构函数调用的先后顺序与构造函数相反
原则: 先构造父类,再构造成员变量、最后构造自己
先析构自己,在析构成员变量、最后析构父类
1、当子类成员变量与父类成员变量同名时
2、子类依然从父类继承同名成员
3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)
4、同名成员存储在内存中的不同位置
总结:同名成员变量和成员函数通过作用域分辨符进行区分
继承和static关键字在一起会产生什么现象哪?
理论知识
类名 :: 成员
或通过对象访问 对象名 . 成员
静态数据成员的初始化必须显式地初始化在外面。这句话告诉编译器分配内存,否则无法继承。
总结:
1> static函数也遵守3个访问原则
2> static易犯错误(不但要初始化,更重要的显示的告诉编译器分配内存)
3> 构造函数默认为private
class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n
{
数据成员和成员函数声明
};
自己的成员
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性(用虚继承来解决)
的基类,则在对该基类中声明的名字进行访问时,可能产生
二义性
汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象
声明为虚继承,使这个基类成为虚基类。
原文:https://www.cnblogs.com/juanjuanduang/p/10847014.html