面向对象构造、析构和virtual规则

1)构造函数是从基类到子类逐步构造,像一颗生长的树。

2)析构函数是从子类到基类逐步析构,像一颗退化的树。

3)基类声明了一个成员函数为virtual,子类只要重写了该方法,无论是否声明为virtual,都将具有多态的性质。

#include <iostream>
using namespace std;

class A
{
public:
	A(){cout << "constructed A"<< endl;}
	virtual ~A(){cout << "destructed A"<< endl;}
	virtual void fun1(){cout << "A" << endl;}
	virtual void fun2(){cout << "A" << endl;}
};

class B:public A
{
public:
	B(){cout << "constructed B"<< endl;}
	~B(){cout << "destructed B"<< endl;}
	void fun1(){cout << "B" << endl;}
	void fun2(){cout << "B" << endl;}
};

class C:public B
{
public:
	C(){cout << "constructed C"<< endl;}
	~C(){cout << "destructed C"<< endl;}
	void fun1(){cout << "C" << endl;}
	void fun2(){cout << "C" << endl;}
};

int main(void)
{
	A* pa;
	pa = new A();
	pa->fun1();
	pa->fun2();
	delete(pa);

	pa = new B();
	pa->fun1();
	pa->fun2();
	delete(pa);

	pa = new C();
	pa->fun1();
	pa->fun2();
	delete(pa);

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个参考实现: ```cpp #include <iostream> #include <string> using namespace std; // 大学生基类 class Student { private: string name; // 姓名 int age; // 年龄 string id; // 学号 public: Student(string name, int age, string id) : name(name), age(age), id(id) {} virtual ~Student() {} // 获取姓名、年龄、学号 string getName() const { return name; } int getAge() const { return age; } string getId() const { return id; } // 设置姓名、年龄、学号 void setName(string name) { this->name = name; } void setAge(int age) { this->age = age; } void setId(string id) { this->id = id; } // 信息输入输出 virtual void input() { cout << "姓名:"; cin >> name; cout << "年龄:"; cin >> age; cout << "学号:"; cin >> id; } virtual void output() const { cout << "姓名:" << name << endl; cout << "年龄:" << age << endl; cout << "学号:" << id << endl; } }; // 测控学生 class MeasurementStudent : public Student { private: int experimentCount; // 实验次数 public: MeasurementStudent(string name, int age, string id, int experimentCount) : Student(name, age, id), experimentCount(experimentCount) {} // 获取实验次数 int getExperimentCount() const { return experimentCount; } // 设置实验次数 void setExperimentCount(int experimentCount) { this->experimentCount = experimentCount; } // 信息输入输出 void input() { Student::input(); cout << "实验次数:"; cin >> experimentCount; } void output() const { Student::output(); cout << "实验次数:" << experimentCount << endl; } }; // 机自学生 class AutomaticControlStudent : public Student { private: string researchArea; // 研究领域 public: AutomaticControlStudent(string name, int age, string id, string researchArea) : Student(name, age, id), researchArea(researchArea) {} // 获取研究领域 string getResearchArea() const { return researchArea; } // 设置研究领域 void setResearchArea(string researchArea) { this->researchArea = researchArea; } // 信息输入输出 void input() { Student::input(); cout << "研究领域:"; cin >> researchArea; } void output() const { Student::output(); cout << "研究领域:" << researchArea << endl; } }; // 过控学生 class ProcessControlStudent : public Student { private: double score; // 成绩 public: ProcessControlStudent(string name, int age, string id, double score) : Student(name, age, id), score(score) {} // 获取成绩 double getScore() const { return score; } // 设置成绩 void setScore(double score) { this->score = score; } // 信息输入输出 void input() { Student::input(); cout << "成绩:"; cin >> score; } void output() const { Student::output(); cout << "成绩:" << score << endl; } }; // 包装学生 class PackagingStudent : public Student { private: string packagingType; // 包装类型 public: PackagingStudent(string name, int age, string id, string packagingType) : Student(name, age, id), packagingType(packagingType) {} // 获取包装类型 string getPackagingType() const { return packagingType; } // 设置包装类型 void setPackagingType(string packagingType) { this->packagingType = packagingType; } // 信息输入输出 void input() { Student::input(); cout << "包装类型:"; cin >> packagingType; } void output() const { Student::output(); cout << "包装类型:" << packagingType << endl; } }; int main() { // 定义大学生对象 Student* student; // 输入测控学生信息 student = new MeasurementStudent("", 0, "", 0); student->input(); student->output(); delete student; // 输入机自学生信息 student = new AutomaticControlStudent("", 0, "", ""); student->input(); student->output(); delete student; // 输入过控学生信息 student = new ProcessControlStudent("", 0, "", 0.0); student->input(); student->output(); delete student; // 输入包装学生信息 student = new PackagingStudent("", 0, "", ""); student->input(); student->output(); delete student; return 0; } ``` 注意,这只是一个参考实现,您可以根据项目需求进行修改和完善。同时,这里采用了指针和动态内存分配,需要注意正确释放动态内存,避免内存泄漏问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值