#include <iostream>
using namespace std;
class Person
{
protected:
string name;
Person(string n) {name = n;}
}
class Student : virtual public Person // 虚继承
{
protected:
int id;
public:
// 如果提供了有参构造函数,系统不会提供缺省构造函数,如果没有提供有参构造函数,则系统会提供一个缺省的构造函数
Student() : Person("") {} // 派生类必须调用父类的构造函数
Student(string n, int i) : Person(n), id(i) {cout << "CS\n";} // 标准格式,派生类必须调用父类的构造函数
~Student() {cout << "DS\n";}
void print() {cout << name << id;}
};
class Teacher : virtual public Person
{
protected:
double salary;
public:
Teacher(string, double) : Person(n){salary = s; cout << "CT\n";} // 不标准
~Teacher() {cout << "DT\n";}
void print() {cout << name << salary;}
};
// 先执行Student的构造函数,再执行Teacher的构造函数,先析构Teacher再析构Student,顺序由此决定
class SJ : public Student, public Teacher // 记得加上public,否则默认private
{
public:
SJ(string, int, double);
~SJ() {cout << "Dsj\n";}
void print();
};
SJ::SJ(string n, int i, double s) // 要给父类提供参数,用标准格式初始化
: Persong(n), // 必须给祖先类实现构造函数
: Student(n, i), Teacher(n, s) // 如果不写Student(n, i),则会调用Student的无参构造函数
{
cout << "Csj\n";
}
void SJ::print()
{
cout << name << id << name2 << salary;
print1(); // 结果和上面相同
print2();
// 或者预操作
Student::print();
Teacher::print();
cout << name << id << salary; // error,因为有两个类
// 使用预操作
cout << Teacher::name << id << salary; // 对
cout << name << id << salary; // 对
}
int main()
{
// Student s;
// Teacher t("zhang", 20000.0);
SJ sj("li", 20230001, 4000.0);
return 0;
}
C++_第十二周课堂笔记_多重继承
最新推荐文章于 2024-06-01 18:28:10 发布