子类生成四个步骤:
1.吸收父类成员
不论是数据成员还是函数成员,除了构造函数和析构函数外全盘吸收
2.改造子类成员
声明一个和某类成员同名的新成员,子类的新成员就屏蔽了父类的同名成员,称为同名覆盖
3.发展新成员
子类新成员必须与父类成员不同名,他的加入保证子类在功能上有所发展
4.重写构造和析构函数
#include <iostream>
using namespace std;
class A
{
public:
void show(){cout << "A类无参show()";}
void show(int a){cout << "A类带参show(int a)";}
};
class B:public class A
{
public:
void show(){cout << "B类无参show()";}
};
int main()
{
B b;
b.show();
//当B类中出现A类中同名的show函数之后,A类中的有参无参show函数都会失效
return 0;
}
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
void show() { cout << "A类无参show()" << endl; }
void show(int a) { cout << "A类带参show(int a)" << endl; }
int y;
};
class B : public A
{
private:
int y;
public:
void show() { cout << "B类无参show()" << endl; }
};
int main()
{
B b;
b.show();
//当B类中出现A类中同名的show函数之后,A类中的有参无参show函数都会被屏蔽,叫同名隐藏
A a;
a = b; //1.子类对象可以对父类赋值,叫对象的切片
A *pa; //2.父类指针
pa = &b; //把子类地址赋值给父类指针
pa->show(); //但是该指针只有权限访问父类的成员
pa->y = 0;
A &c = b;//3.派生类可以给父类的引用初始化
c.show();//引用是变量的别名,是派生类中隐藏的父类的别名
c.y = 1;
return 0;
}
virtual函数的多态
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
virtual void show() { cout << "A类无参show()" << endl; }
void show(int a) { cout << "A类带参show(int a)" << endl; }
int y;
};
class B : public A
{
private:
int y;
public:
void show() { cout << "B类无参show()" << endl; }
};
int main()
{
B b;
b.show();
//当B类中出现A类中同名的show函数之后,A类中的有参无参show函数都会被屏蔽,叫同名隐藏
A *pa; //2.父类指针
pa = &b; //把子类地址赋值给父类指针
pa->show(); //在父类void show()函数前加入virtual 就可以访问子类的show()函数
pa->y = 0;
A &c = b;//3.派生类可以给父类的引用初始化
c.show();//此时也调用了子类的show()函数
c.y = 1;
//这种现象叫多态,看似是调用了父类,实际是调用了子类,同一种事物的多重形态,叫多态
return 0;
}