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(); //小新,10
People* p1=&s1;//子类对象可以直接转换为基类对象
p1->who(); //小新,10
People 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;
}