2017-05-01 32 views
0

任何人都告诉我如何调用流>>运算符为抽象类指针的二维对象在main中。流运算符和抽象类

我想为基类中所有派生类的私有成员赋值。可能吗 ?怎么样?

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

感谢Mr.Richard – Nouman

+0

您的意思是派生类除了'employee'中还有'private'成员,并且调用了一个call像'std :: cin >> my_employee;'应该允许用户为他们输入值? –

回答

0

保持基类中的所有运算符重载(直接或通过语义上的friend)。做不是考虑让操作员虚拟。让您的运营商在employee对象上调用私有虚拟成员函数;该函数充当一个派生类可以覆盖以增加更多输入操作的钩子。

这种方法背后的基本思想是将类的公共接口与派生类可访问的定制点分开,这与Non-Virtual Interface Idiom或Template Method设计模式有关。

这里是一个例子;有在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再次从继承这种方法可以变得有些笨拙,因为这样你会必须添加另一个钩子函数。但是,应用程序的业务逻辑中具有两个以上级别的类层次往往是不好的设计,并且通常是指示您应该切换到基于合成的设计。

+0

谢谢...... Christian Hackl – Nouman

+0

这个技巧是从上到下还是我们可以跳到特定类 – Nouman

+0

@Nouman:你是否熟悉虚函数?如果没有,你应该学习更简单的例子... –