class Sinhvien :public Congdan{// khai bao ke thua cua class
protected:
int MSSV;
public:
Sinhvien(){
Congdan();
MSSV =0;
}
Sinhvien(int MSSV, int cccd, int namsinh): Congdan(cccd, namsinh){// ke thua cua constructor
this->MSSV = MSSV;
}
void Nhap(){
cout<<"Nhap cua lop sinh vien";
Congdan::Nhap();
cin>> MSSV;
//Hoac cin>>MSSV>>cccd>>namsinh;
}
void DiHoc(){
cout<<"Hoc sinh di hoc"<< endl;
}
void Xuat(){
cout<<"Du lieu cua lop sinh vien ";
Congdan::Xuat();
cout<< MSSV;
//cout<<MSSV<<cccd<<namsinh;
}
};
int main(){
Sinhvien a;
a.DiHoc();
//Su dung con tro trong ke thua
Congdan* p;
Congdan b(123, 2003);
Sinhvien sv1(124, 2004, 192929);
p =&b;// duoc
p =&sv1;// cũng được do tính chất là 1 của tính kế thừa .
/*
Sinhvien *p;
Congdan b(123, 2003);
Sinhvien sv1(124, 2004, 192929);
p = &sv1;// được
p= &b;// sẽ bị error do tính chất của kế thừa chỉ có từ cha xuống con chứ không được từ con lên cha .
*/
p->Nhap();//Tự đặt câu hỏi Nhap() ở đây sẽ gọi hàm Nhap() của Congdan hay của Sinhvien mình muốn là của sinh viên nhưng thực chất sẽ gọi Nhap() của Congdan vì ban đầu con trỏ p mình khai báo là congdan Nên từ đó mới sinh ra khái niệm virtual .
p->Xuat();//Tương tự cũng sẽ gọi hàm của Congdan
//Muốn sửa hàm Nhap và Xuat thành của lớp Sinhvien thì mình thêm virtual vào đầu các hàm mình muốn nó cân nhắc đến chỗ gọi hàm xem đang được gán với class nào để gọi hàm đó .