文章内容如下:
1)继承
2)继承中构造和析构的顺序
3)子类调用父类的成员对象、父类的有参构造
4)继承中的同名处理
5)子类不能继承父类的成员
一。继承
保留父类的数据和方法,自己再新增一部分数据和方法叫继承。继承的作用是为了提高代码重用,提高开发效率。继承用如下格式表述,继承规则是,所有父类私有在子类中不可访问,公共继承保持不变,保护继承变保护,私有继承变私有。
class 父类{};
class 子类:继承方式 父类名
{
"""新增子类数据"""
};
"""继承方式为"""
"""private protected public(推荐)"""
二。继承中构造和析构的顺序
当我们构建子类的时候,其实是先把子类所对应的父类给构造出来,再构造对象成员的构造函数,然后再构造子类自身的空间,析构这与其相反。一句话总结,构造:父成子(父类-成员(变量,函数,类的对象)-子类);析构:子成父。
class Base
{
public:
Base(){cout << "父类构造" << endl;}
~Base(){cout << "父类析构" << endl;}
};
class Other
{
public:
Other(){cout << "Other构造" << endl;}
~Other(){cout << "Other析构" << endl;}
};
class Son:public Base
{
public:
Other ob;
public:
public:
Son(){cout << "Son构造" << endl;}
~Son(){cout << "Son析构" << endl;}
};
int main()
{
Son ob;
return 0;
}
三。子类调用父类的成员对象、父类的有参构造
子类实例化对象时,会自动调用成员对象默认构造、父类对象默认构造,即默认掉用都是无参构造,子类只有使用初始化列表才能调用成员对象,父类的有参构造
Son(int a,int b,int c):Base(a),ob(b)
{
this->c = c;
cout << "Son有参构造" << endl;
}
"""Base是父类名称,ob是成员对象,Son是Base的子类,因为Base没有对象所以只能用父类名"""
四。继承中的同名处理
同名处理是针对子类与父类提出的,有时候子类继承了父类的一些成员但是并不熟悉这些成员的名字,会出现子类取成员名与父类成员名同名的情况,针对这种情况最简单最安全的处理方式是加作用域,即访问子类不需要加作用域,访问父类要加作用域,这是因为同名时默认优先访问子类成员
class Base
{
public:
int a;
public:
Base(int a){this->a;}
};
class Son:public Base
{
public:
int a;
Son(int x,int y):base(x){a = y}
};
int main()
{
son ob(10,20)
cout << ob.a << endl;"""默认访问子类中的a"""
cout << ob.Base::a << endl;"""这是在访问父类中的a"""
}
五。子类不能继承父类的成员
子类不能继承父类的构造函数,析构函数以及operator=也不能被继承。