用户登录,为企业做好服务优化营商环境,百度做网站的特点,汕头论坛网目录 一、基本语法 二、继承方式
三、对象模型
四、继承中的构造与析构的顺序
五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处#xff1a;减少重复的代码 语法#xff1a; class 子类 #xff1a; 继承方式 父类 子类 也称为 派生类 父类…目录 一、基本语法 二、继承方式
三、对象模型
四、继承中的构造与析构的顺序
五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处减少重复的代码 语法 class 子类 继承方式 父类 子类 也称为 派生类 父类 也称为 基类 派生类中的成员包含两大部分 一类是从基类继承过来的一类是自己增加的成员 从基类继承过来的表现其共性而新增的成员体现了其个性 二、继承方式 class 子类 public 父类 父类中的public、protected继承在子类中依然不变私有权限无法继承。 class 子类 protected 父类 父类中的public、protected继承在子类时变为protected私有权限无法继承。 class 子类 private 父类 父类中的public、protected继承在子类时变为private私有权限无法继承。 代码示例
#includeiostream
using namespace std;class base1{public:int m_A;
protected:int m_B;
private:int m_C;
};// public 继承
class Son1 : public base1{ void fun(){m_A 10;m_B 10;
// m_C 10; //私有权限无法继承}
};
void test1(){Son1 son1;son1.m_A 2;
// son1.m_B 3;
// son1.m_C 4;
}// protected 继承
class Son2 : protected base1{void fun(){m_A 10; //变为protectedm_B 10;//变为protected//m_C 10; //私有权限无法继承}
};
void test2(){Son2 son2;// son2.m_A 2; //变为protected类外无法访问// son2.m_B 3; //变为protected类外无法访问// son2.m_C 4;
}// private 继承
class Son3 : private base1{void fun(){m_A 10; //变为privatem_B 10; //变为private//m_C 10; //私有权限无法继承}
};
void test3(){Son3 son3;
// son3.m_A 2; //变为private类外无法访问// son2.m_B 3; //变为private类外无法访问// son2.m_C 4;
}
int main(){test1();test2();test3();return 0;
}
三、对象模型 父类当中的非静态成员变量都会继承下去私有成员也会继承只是不能访问 代码示例
#includeiostream
using namespace std;class per{
public:int m_A;
protected:int m_B;
private:int m_C;
};class son : public per{
public:int m_D;
};void test(){coutsizeof(son)sizeof(son)endl;
}int main(){test();
}
四、继承中的构造与析构的顺序 先构造父类再构造子类。析构顺序与构造顺序相反 代码示例
#includeiostream
using namespace std;class Base{
public:Base(){cout父类中的构造endl;}~Base(){cout父类中的析构endl;}
};class Son : public Base{
public:Son(){cout子类中的构造endl;}~Son(){cout子类中的析构endl;}
};void test(){
// Base b;Son s;
}
int main(){test();return 0;
}
五、继承中同名成员处理 子类对象可以直接访问到子类中的同名函数子类对象加作用域可以访问到父类中的成员函数当子类与父类拥有同名的成员函数时子类会隐藏父类中同名的成员函数加作用域可以访问到父类中的同名函数 非静态成员变量与静态成员变量处理方式一致只不过静态成员变量有两种访问方式 通过对象进行访问 例s.fun();通过类名进行访问 例Son::Base::fun(); 代码示例
#includeiostream
using namespace std;class Base{
public:Base(){m_A 100;}void fun(){coutBase 的 fun()endl;}void fun(int ){coutBase 的 fun(int)endl;}int m_A;
};class Son : public Base{
public:Son(){m_A 200;}void fun(){coutSon 的 fun()endl;}int m_A;};void test(){Son s;coutm_As.m_Aendl; //200coutm_As.Base::m_Aendl; //100同名时调用父类中的成员需要加作用域s.fun();s.Base::fun();s.Base::fun(1); // 子类与父类拥有同名的成员函数时子类会隐藏父类中所有版本的同名函数
}
int main(){test();return 0;
} 六、多继承语法 语法class 子类 继承方式 父类1 继承方式 父类2... 代码示例
#includeiostream
using namespace std;class Base1{
public:Base1(){m_A 100;}int m_A;
};class Base2{
public:Base2(){m_A 200;}int m_A;
};class son : public Base1,public Base2{
public:son(){m_B 200;}int m_B;
};void test (){son s;coutsizeof(s)sizeof(s)endl;couts.Base1::m_Aendl; // 继承中出现同名时需要作用域couts.Base2::m_Aendl;
}
int main(){test();
} 七、菱形继承 关键字virtual 如下示例加上virtual关键字后Sleep和Tuo 两个类里的m_Age 存的是 vbptr(虚基类指针)指向各自的 vbtable(虚基类列表)。从而直接拿到Animal 中的m_Age解决SleepTuo 拿到两份相同数据的问题。 代码示例
#includeiostream
using namespace std;class Animal{
public:int m_Age;
};// 当子类继承两份相同的数据时
// 继承前加上 virtual 关键字后变为虚继承
// 此时公共的父类 Animal 称为虚基类
class Sleep : virtual public Animal{};
class tuo : virtual public Animal{};class SleepTuo : public Sleep , public tuo{};void test1(){SleepTuo y;y.Sleep::m_Age 100;y.tuo::m_Age 200;couty.Sleep::m_Ageendl;couty.tuo::m_Ageendl;couty.m_Ageendl;
}int main(){test1();
}