C++公用继承的基本要点

来源:互联网 发布:攻沙翅膀进阶数据 编辑:程序博客网 时间:2024/05/21 08:04

1.一个子类类型的对象在任何时候都可以被视作它的基类类型的对象,前提是通过指针或引用访问该对象。
2.一个基类类型的指针或引用不能隐式转换为其子类类型,通过强制类型转换固然可以避免编译问题,但存在运行时风险。
3.基类中的私有成员在子类中存在但不可见,故无法直接访问。可以通过调用基类中的公有成员函数访问。
4.基类中的保护成员可以被子类访问。
5.在子类中可以定义和基类中同名的标识符,并对后者构成隐藏。

示例代码:

#include<iostream>using namespace std;class People{public:People(const string& name="没名",int age=80):m_name(name),m_age(age){}void who(void)const{ cout<<m_name<<","<<m_age<<endl;}private:string m_name;int m_age; };class Student:public People{public:Student(const string& name,int age,int num):People(name,age),m_num(num){}void learn(const string& lesson){cout<<"我在学"<<lesson<<','<<"我的学号"<<m_num<<endl;}private:int m_num;};int main(void){Student s1("小新",10,101);s1.learn("C++");//....s1.who(); //小新,10People* p1=&s1;//子类对象可以直接转换为基类对象p1->who();  //小新,10People p2("小亮",11);Student *st =static_cast<Student*> (&p2);//只能显示转换不能隐式转换//Student *st =(Student*)&p2;st->learn("C");//我在学C,我的学号987987;//强转导致内存泄露,学号丢失。return 0;}
 

隐藏示例代码:

#include <iostream>using namespace std;class A{public: A(int n =0):m_n(n){} void print(void){  cout<<m_n<<endl; } int m_n;};class B: public A{public: B(int n):m_n(n){} int m_n;};int main(void){ B b(100); b.print();// 0  基类中的m_n被B类中的m_n隐藏了,最终看到的是A类的 return 0;}