C++ 流算子与抽象类

C++ 流算子与抽象类,c++,C++,有人告诉我如何为main中抽象类指针的2D对象调用stream>操作符吗 我想将该值分配给基类中所有派生类的私有成员。可能吗?怎么做 istream&operator>>(istream&input,empolye&p) { cout>p.type; 可飞行床; cout>p.empolye_型; cout>p.name; cout>p.age; cout>p.dateOfjoin; } 我希望每个人都能理解我的问题。 谢谢大家。在基类中保留所有运算符重载(直接或通过friend语义)。不要考

有人告诉我如何为main中抽象类指针的2D对象调用stream
>
操作符吗

我想将该值分配给基类中所有派生类的私有成员。可能吗?怎么做

istream&operator>>(istream&input,empolye&p)
{
cout>p.type;
可飞行床;
cout>p.empolye_型;
cout>p.name;
cout>p.age;
cout>p.dateOfjoin;
}
我希望每个人都能理解我的问题。
谢谢大家。

在基类中保留所有运算符重载(直接或通过
friend
语义)。不要考虑将操作员虚拟化。在
employee
对象上实现操作员呼叫私有虚拟成员功能;该函数充当钩子,派生类可以重写该钩子以添加更多的输入操作

这种方法将类的公共接口与派生类可访问的自定义点分离,其基本思想与模板方法或设计模式有关

这是一个例子;仔细查看
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;
}
#包括
#包括
班级员工
{
公众:
虚拟~employee(){}
friend std::istream&operator>>(std::istream&input,employee&p)
{
std::cout>p.type;
标准::cout>p.可用床;
标准::cout>p.employee\u类型;
std::cout>p.name;
std::cout>p.age;
标准::cout>p.加入日期;
p、 阅读更多(输入);
返回输入;
}
私人:
虚拟void ReadMore(std::istream&){
int型;
内景床;
int雇员类型;
std::字符串名;
智力年龄;
int加入日期;
};
特殊类别雇员:公共雇员
{
私人:
void ReadMore(std::istream&input)覆盖
{
标准::cout>额外数据;
}
int-extra_数据;
};
int main()
{
特殊员工我的特殊员工;
员工&我的员工=我的特殊员工;
std::cin>>我的员工;
}

如果再次继承了
special\u employee
,这种方法可能会变得有些笨拙,因为这样您就必须添加另一个钩子函数。但是,应用程序的业务逻辑中有两个以上级别的类层次结构通常都是糟糕的设计,通常是一个指标,指示您应该切换到基于组合的设计。

是的,但是键入,name etc需要是传递数据引用的函数。谢谢Richard先生,您的意思是派生类除了
employee
中的成员外,还具有其他
private
成员,以及类似
std::cin>>my_employee的调用应允许用户为其输入值?完全正确,谢谢。。。Christian HacklIs这项技术适用于自上而下,或者我们也可以跳到特定位置class@Nouman:您熟悉虚拟功能吗?如果没有,你应该用更简单的例子来学习……谢谢@Christian Hack