类和对象_继承

版权声明:私藏源代码是违反人性的罪恶行为!博客转载无需告知,学无止境。 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指针来识别成员数据属于哪个对象。

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/83589002