版权声明:私藏源代码是违反人性的罪恶行为!博客转载无需告知,学无止境。 https://blog.csdn.net/qq_41822235/article/details/83589002
一、 继承
1. 继承关系是类中成员方法的关系:
class Base
{
public:
void show() //方法1
{
cout<<Base::show()<<endl;
}
void show(int a) //方法2
{
cout<<Base::show(int a)<<endl;
}
}
class Derive
{
public:
void show() //方法3
{
cout<<Derive::show()<<endl;
}
}
- 重载:同作用域是前提,函数名相同,参数类型列表不同。正如方法1和方法2。
- 隐藏:父类和子类的同名方法,在子类作用域中被隐藏。正如方法1和方法3。
- 覆盖:子类中同名,同参数类型列表,同返回值的成员方法覆盖子类中的虚成员方法。
2. 相互赋值,记住一点——“宁滥勿缺”
父类对象赋值给子类对象。×不可行- 子类对象赋值给父类对象。
子类指针指向父类对象。×不可行- 父类指针指向子类对象。
为什么第一条和第三条不可行?这不涉及语法——试想一下,如果子类对父类进行扩充,父类对象给子类对象赋值,扩充部分的值从何而来?总不能赋值结束子类对象都已经生成了却还是不完整的吧?第一条不可行原因在于此。子类指针指向父类对象,如果想通过子类指针访问子类扩充部分的内容(变量和成员方法),而父类对象是没有的,会出错。第三条不可行的原因在于此。
3. 四种强转方式(有机会自己实现)
- const_cast:去掉const属性。
- static_cast:编译器认为安全的强转方式。
- reinterpret_cast:强制类型转换
- dynamic_cast:继承关系中专用的强转, RTTI(Run-Time Type Identification运行时类型识别)。模板类型参数必须是void*或者指向类类型的指针(引用)——类类型必须具有RTTI。
4. 虚函数
虚函数调用必须依赖对象内部的虚函数表。
构造函数:
对象没有构造完成=>对象不完整。构造函数不可以实现为虚函数。构造函数内部不可以多态调用虚函数,因为对象不完整。
析构函数:
可以实现为虚函数,但是析构函数内部不可以多态调用虚函数,因为对象不完整。
5. this指针
对象之所以能调用成员函数,是因为类的成员函数在编译时,编译器自动在参数类型列表第一个位置添加this指针来识别成员数据属于哪个对象。