任何人都告诉我如何在main中为抽象类指针的2D对象调用流>>
运算符。
我想将值分配给基类中所有派生类的私有成员。可能吗 ?怎么样?
istream & operator>>(istream& input,empolye &p)
{
cout << "Enter department type:";
input >> p.type;
cout << "Enter available bed:";
input >> p.avilable_bed;
cout << "Enter type of empolye ";
input >> p.empolye_type;
cout << "Enter empolye name";
input >> p.name;
cout << "Enter age";
input >> p.age;
cout << "Enter date of join";
input >> p.dateOfjoin;
}
我希望每个人都能得到我的问题。 谢谢大家。
答案 0 :(得分:0)
保持所有运算符在基类中重载(直接或通过friend
语义)。 不考虑让操作员虚拟化。让运算符的实现在employee
对象上调用私有虚拟成员函数;该函数充当派生类可以覆盖的钩子,以添加更多输入操作。
这种方法背后的基本思想是将类的公共接口与派生类可访问的自定义点分开,它与Non-Virtual Interface Idiom或模板方法设计模式有关。
这是一个例子;仔细看看ReadMore
函数,它在基类中什么也不做,但在派生类中做了什么:
#include <iostream>
#include <string>
class employee
{
public:
virtual ~employee() {}
friend std::istream& operator>>(std::istream& input, employee &p)
{
std::cout << "Enter department type: ";
input >> p.type;
std::cout << "Enter available bed: ";
input >> p.available_bed;
std::cout << "Enter type of employee: ";
input >> p.employee_type;
std::cout << "Enter employee name: ";
input >> p.name;
std::cout << "Enter age: ";
input >> p.age;
std::cout << "Enter date of join: ";
input >> p.date_of_join;
p.ReadMore(input);
return input;
}
private:
virtual void ReadMore(std::istream&) {}
int type;
int available_bed;
int employee_type;
std::string name;
int age;
int date_of_join;
};
class special_employee : public employee
{
private:
void ReadMore(std::istream& input) override
{
std::cout << "Enter extra data: ";
input >> extra_data;
}
int extra_data;
};
int main()
{
special_employee my_special_employee;
employee& my_employee = my_special_employee;
std::cin >> my_employee;
}
如果再次继承special_employee
,这种方法会变得有点笨拙,因为那时你必须添加另一个钩子函数。但是,在应用程序的业务逻辑中具有两个以上级别的类层次结构通常是糟糕的设计,并且通常是指示您应该切换到基于组合的设计。