#include<iostream>
#include<cstring>
using namespace std;
class Student {
//private:
protected:
string name;//32 bits
int num;//4 bits
int age;//4 bits
public:
Student(string, int, int);
void print() { cout << name << " " << num << " " << age << endl; }
void print1() { cout << name << " " << num << " " << age << endl; }
void brint() { cout << "Student brint" << endl; }
~Student() { cout << "Destruct Student" << endl; }
};
class IOTStudent :public Student {
private:
int cpp;//4 bits
public:
void print() { cout << name <<" " <<" "<< num <<" " << age<<" "<<cpp<<endl; }//若Student类的name num age是protected则可以访问,若为private则无法访问
void print2() { cout << name << " " << " " << num << " " << age << " " << cpp << endl; }
void brint() { cout << "IOTStudent brint" << endl; }
IOTStudent(string, int, int,int);
~IOTStudent() { cout << "Destruct ToStudent" << endl; }
};
Student::Student(string name1, int num1, int age1) :name(name1), num(num1) {
age = age1;
cout << "construct Student" << endl;
}
IOTStudent::IOTStudent(string name1, int num1, int age1,int cpp1) :Student(name1,num1,age1) //子类的构造函数必须给父类提供参数初始化
{
cpp = cpp1;
cout << "construct ToStudent" << endl;
}
void f(Student* p) {
p->brint();
}
void h(IOTStudent* p) {
p->brint();
}
int main() {
Student s1("zhang", 203002, 19),*p1;
IOTStudent s2("li", 2023001, 20,26),*p2;
//调用子类的构造函数时,会先自动调用父类的构造函数再调用子类的构造函数
//所有子类的析构函数被调用时会自动调用父类的析构函数
cout << "size of Student is: " << sizeof(Student) << endl;// 48 ,Student对齐方式 8bits +32+4+4
cout << "size of ToStudent is: " << sizeof(IOTStudent) << endl;// 56 IOTStudent对齐方式 8bits +32+4+4+4
//cout << s2.name; error 不可访问
s2.print(); //子类的print()
s2.print1();
s2.Student::print();
//函数名相同时,用这种方式来调用父类函数
//:: 表示预操作
s1 = s2;//将s2的信息复制到s1(无使用价值)
// s2 = s1; error 找不到cpp的空间,cpp会变成随机数
p1 = &s1;
p2 = &s2;
p1 = &s2;//父类指针指向子类
// p2 = &s1; error 找不到cpp的空间,cpp会变成随机数
p1->brint();// "Student brint"
p1 = p2;// p1=&s2;
//p2 = p1 error 找不到cpp的空间,cpp会变成随机数
p1->brint();// "Student brint\n" p1是Student类型!! 静态编译
p2->brint();//"IOTStuden brint\n" p2是IOTStudent类型!!
f(&s1);// "Student brint\n"
f(&s2);// "Student brint\n" 传入后类型发生转化
//静态联编的情况下 判断标准是函数的参数类型
//h(&s1); error
h(&s2);
return 0;
}
CPP 类与对象# 继承
最新推荐文章于 2024-06-09 20:18:37 发布