1.重载
- 函数名相同
- 作用域相同
- 函数参数不同
class Base
{
public:
//这两个函数构成重载
void show()
{
cout << "Base::void show()" << endl;
}
void show(int i)
{
cout << "virtual void show(int i )" << endl;
}
};
这两个函数就构成了重载,在相同的作用域内,函数名相同,参数不同
2.隐藏
隐藏很简单,就是派生类中的函数会隐藏基类中同名的函数,无关其他
class Base
{
public:
void show()
{
cout << "Base::void show()" << endl;
}
};
class Derive :public Base
{
//隐藏父类中的void show函数
public:
void show()
{
cout << "Derive::void show()" << endl;
}
};
隐藏发生后,父类还是调用父类的函数,子类还是调用子类的函数
3.覆盖
- 基类和派生类中的函数同名,同参数
- 基类中的函数是虚函数
- 派生类中的同名同参的函数覆盖了基类中同名同参的虚函数
class Base
{
public:
//这两个函数构成重载
virtual void show()
{
cout << "Base::void show()" << endl;
}
void show(int i)
{
cout << "virtual void show(int i )" << endl;
}
};
class Derive :public Base
{
//隐藏父类中的void show函数
public:
void show()
{
cout << "Derive::void show()" << endl;
}
};
int main()
{
Base *base = new Derive();
base->show();
return 0;
}
定义一个基类的指针指向子类的对象,调用show函数的时候派生类会把基类的show函数覆盖,所以调用的是派生类的
面试点
1.派生类继承了基类的什么?
我们通过下面一段代码看一下
#include<iostream>
#include<string>
class People
{
public:
People(std::string name, int age, bool sex)
:mname(name), mage(age), msex(sex){}
void eat()
{
std::cout << mname << " can eat !" << std::endl;
}
static int ma;
void Show()
{
std::cout << "hello world!" << std::endl;
}
typedef int Elem_Type;
protected:
std::string mname; //28
int mage; // 4
bool msex; // 4
};
int People::ma = 10; //静态的成员变量需要在类外初始化
class Student : public People
{
public:
Student(std::string name, int age, bool sex, std::string id)
:mid(id), People(name, age, sex){}
protected:
std::string mid;//28
};
int main()
{
Student stu("zhangsan", 20, true, "001");
stu.eat();
std::cout << sizeof(Student) << std::endl;
std::cout << sizeof(People) << std::endl;
std::cout<<Student::ma<<std::endl;
stu.Show();
Student::Elem_Type a;
return 0;
}
我们在student中没有实现任何方法,但是我们从main函数调用发现,stu可以调用people中任意一个成员函数和成员变量,打印子类student的大小也是父类的大小加上自己的大小
所以派生类继承了父类中除了构造函数和析构函数意外所有的成员。
2.派生类的内存布局
基类的布局优先于派生类
3.派生类的析构方式和构造方式
又上图可以看出,父类先构造,然后子类在构造;在析构的时候正好相反,子类先析构,父类在析构
4.继承方式的权限
1.子类无法访问父类中的private成员
2.父类的protected成员可以被子类访问,但是不可以被外部访问
3.private会被继承,但是无法访问
4.class中默认的方式是private,继承默认也是private方式
5.父类中成员通过相应的继承方式继承给子类后,这些成员对于子类来说,访问权限以继承的等级为最低级别。例如:父类中A为private权限,无论通过什么方式都不可以访问该变量
5.类和类的关系
1.组合 a part of has_a
2.继承 a kind of is_a
3.代理