继承:
面向对象最重要的概念
:依据一个类来定义拎一个类
class Derived ::Base,这就是一个私有继承
继承类的存储结构:
虚方法->重载
虚函数表->8个字节
B->A->A:->A{}->B:->B{};
与C#和java的最大区别是要自己维护内存,
#include<iostream>
using namespace std;
class A{
}
class B:public A{
private:
int _m;
objectA _OA;
objectB _OB;//构造顺序按定义顺序
public:
B():A(){
cout<<"B construct "<<endl;
B(int m):_m(m){//若没有显示指定,会调用默认构造函数
cout<< "B int constructor"<<endl;
}
B(const B&b):A(b){
}
void operator=(const B& b){
A::operator=(b);
}
virtual ~ B(){//父类指针可以调用子类的析构函数
cout<<""<<endl;
}
void f(){
cout<<"call function B::F"<<endl;
}
void g() override{//虚方法一直调子类的
cout<<"call function B::g"<<endl;
}
}
int main(){
B bb(1);
bb.f();
bb.g();
B*pB=new B();
pB->f();
pB->g();
A*pA2=PB;
//父类指针可以指向子类,但子类指针无法指向父类
B*pB2=(B*)pA2;//可以进行强转
PB2->f()//可能报内存错误
B*pB3=static_cast<B*>(pA2);
B*pB3=dynamic_cast<B*>(pA2);//进行动态转换比较安全,通过虚函数表来判断
if(pB4){
cout<<"dynamic success"<<endl;
}else{
cout<<"dynamic failed"<<endl;
}
A*pA=new pB();
delete pA;
B*pB=new B();
pB->A::f();
return 0;
}
继承权限:
子类访问权限:访问权限+继承权限做叠加操作
外部访问权限:继承权限
C++允许多继承
问题:
菱形继承->虚继承解决问题
D*d=new D();