c++ - C++ 打印与死亡钻石
问题描述
首先让我解释一下我的层次结构:
Person
/ \
Student Employee
\ /
Intern
每个类都有output
自己的函数,打印它们的数据成员,我只需要打印Person
一次。问题是Student
andEmployee
不是抽象类,而且人们也会制作他们类型的对象,所以我不能只在Intern
级别上调用输出函数。
正如您将在下面的代码中看到的那样,我已经设法解决了这个问题,但我认为这很丑陋而且不是很多态。我创建了一个额外的输出函数,因此它适用于所有情况。有没有更好的方法来实现这一点?
class Person {
string name;
int id;
public:
virtual void output(ostream& out) {
out << name << "," << id;
}
}
学生:
class Student : virtual public Person {
string major;
int year;
public:
virtual void output(ostream& out) {
Person::output(out);
out << "," << major << "," << year;
}
virtual void outputStudOnly(ostream& out) {
out << "," << major << "," << year;
}
};
员工:
class Employee : virtual public Person{
string jobTitle;
public:
virtual void output(ostream& out) {
Person::output(out);
out << "," << jobTitle;
}
virtual void outputEmpOnly(ostream& out) {
out << "," << jobTitle;
}
};
和实习生:
class Intern : public Student, public Employee {
public:
virtual void output(ostream& out) {
Person::output(out);
Student::outputStudOnly(out);
Employee::outputEmpOnly(out);
}
};
解决方案
那是什么模板方法。以下是我将如何编写此代码:
class Person {
string name;
int id;
public:
void output(ostream& out) {
out << name << "," << id;
output_impl(out);
}
private:
virtual void output_impl(ostream& ) {}
};
class Student : virtual public Person {
string major;
int year;
private:
virtual void output_impl(ostream& out) {
out << "," << major << "," << year;
}
};
class Employee : virtual public Person {
string jobTitle;
private:
virtual void output_impl(ostream& out) {
out << "," << jobTitle;
}
};
class Intern : public Student, public Employee {
private:
virtual void output_impl(ostream& out) {
Student::output_impl(out);
Employee::output_impl(out);
}
};
而不是你调用output
的对象。
推荐阅读
- machine-learning - 错误不匹配 m1 和 m2,我的卷积层计算有什么错误?
- javascript - 从javascript中的字符串替换子字符串
- spring-boot - spring.profile 和 spring.config.activate.on-profile 有什么区别?
- javascript - 使用 javascript 在本地专用网络中发现 Web 服务
- powershell - Powershell Selenium:无法在亚马逊上找到元素
- python - 如何在没有 if/for 的情况下最小化一个数字
- r - 使用R中的echarts在radarchart中渐变颜色
- python - 仅设置某些小部件以随窗口调整大小
- python - Pyamg 不起作用(没有名为“pyamg.amg_core.evolution_strength”的模块)
- vaadin - 如何定义 CRUD 网格中的列?