知识点1【继承】
继承描述的是类和类的关系,如果A类继承于B类,那么A类就拥有B的数据和方法,同时A类可以新增自己的数据和方法。
1、继承的语法
class 子类名:继承方式(public protected private) 父类名
{
//新增的数据和方法
}
不管任何继承方式 父类私有数据 在子类中 不可见
(不管任何继承方式 父类私有数据 在子类中 不可见)公共继承保持不变,保护继承变保护,私有继承变私有。
2、继承中的构造和析构顺序
3、如果要调用父类以及对象成员的有参构造 必须使用初始化列表。
Son(int a, int b, int c):Base(a),ob(b),c(c)
{
cout<<"Son有参参构造函数"<<endl;
}
子类 默认会调用父类以及对象成员的无参构造。
注意:在使用初始化列表时,调用父类的有参构造需要父类名,调用对象成员的有参构造 用对象名。
4、如果父类和子类有同名 (加作用域 简单-有效)
4.1 父类和子类的数据 同名
子类对象 优先调用子类自身的同名成员。
子类对象 访问父类同名成员 加父类作用域。
class Base
{
public:
int a;
Base(int a)
{
this->a = a;
cout<<"Base有参构造函数 a="<<a<<endl;
}
};
class Son:public Base
{
public:
int a;
Son(int a, int b):Base(a),a(b)
{
cout<<"Son有参参构造函数"<<endl;
}
};
void test01()
{
Son ob1(10,20);
cout<<ob1.a<<endl;//优先访问子类的a 10
cout<<ob1.Base::a<<endl;//强制访问父类的a 20
}
4.2 父类和子类的函数 同名
一旦子类 重新定义 父类的同名函数(只要函数名相同即可),子类都屏蔽父类所有的同名函数。(但是 可以加父类作用域 访问父类的同名函数)。
class Base
{
public:
void func(void)
{
cout<<"父类的func void"<<endl;
}
void func(int a, int b)
{
cout<<"父类的func int int "<<endl;
}
void func(int a, int b,int c)
{
cout<<"父类的func int int int "<<endl;
}
};
class Son:public Base
{
public:
void func(void)
{
cout<<"子类的func void"<<endl;
}
};
void test01()
{
Son ob1;
ob1.func();
ob1.Base::func();
ob1.Base::func(10,20);
ob1.Base::func(10,20,30);
}
5、重载、重定义的区别(记)
重载:没有继承,同一作用域 函数名相同 参数的个数、顺序、类型不同 返回值类型不能作为重载条件。
重定义:有继承,子类重新定义父类的同名函数。(只要函数名相同即可)
6、子类无法继承父类的方法(记)
子类 无法继承 父类的构造、析构、operator=。