定义:继承性是面向对象编程的重要特性,它允许一个类(子类或派生类)继承另一个类(父类或基类)的成员变量和成员函数,以实现代码复用和层次化设计,有公有、保护和私有继承三种方式。
如何实现继承:
cpp
#include<iostream>
#include<unordered_map>
using namespace std;
class A //A父类、基类
{
public:
int num;
void fun()
{
cout << "A fun" << endl;
}
};
//继承就是通过已经存在的类创建新的类
class B :public A //B子类、派生类
{
};
int main()
{
B b;
b.num = 2;
b.fun();
return 0;
}
好处:
提高代码的复用性
注意事项:
1.会出现父、子类出现同名成员
继承同名成员处理方式
访问子类同名成员: 直接访问即可
访问父类同名成员 : 需要加作用域
当父类和子类中有同名函数时,子类中的函数会将父类中的同名函数隐藏(函数隐藏)
如果此时想通过子类对象访问父类对象,需要作用域
父类对象不可以访问子类对象中的成员变量,因为创建父类对象不会创建子类对象
cpp
#include<iostream>
#include<unordered_map>
using namespace std;
class A
{
public:
int num;
void fun()
{
cout << "A fun" << endl;
}
void fun(int a)
{
cout << "A int fun" << endl;
}
};
class B:public A
{
public:
int num;
void fun()
{
cout << "B fun" << endl;
}
};
int main()
{
B b;
b.num = 2; //访问的是子类的成员变量
b.fun(); //访问的是子类的成员函数
b.A::num = 3; //访问的是父类的成员变量
b.A::fun();
b.A::fun(2);
cout << b.num << " " << b.A::num << endl;
return 0;
}
2.会出现菱形继承现象
菱形继承:
两个派生类继承同一个基类,又有某一个类同时继承这两个派生类
cpp
#include<iostream>
using namespace std;
class A{
public:
int a;
A(){
cout<<"A构造";
}
};
class B:virtual public A//virtual为虚继承的关键字
{
public:
B(){
cout<<"B构造";
}
};
class C:virtual public A//virtual为虚继承的关键字
{
public:
C(){
cout<<"C构造";
}
};
class D:public A,public B//virtual为虚继承的关键字
{
};
int main(){
D d;
d.a;
d.B::a;
return 0;
}
总结:
菱形继承会使子类继承两份相同的数据,导致资源浪费