重载流操作符时不能为虚函数

来源:互联网 发布:人工智能大会 编辑:程序博客网 时间:2024/05/17 23:51

为了能够像cout,cin这样使用<<,>>流操作符来操作对象,对<<,>>的重载有下面几个约定:第一个参数为ostream或istream的引用,第二个参数为类类型,返回与第一个参数类型相同的引用.所以,可以基本得到重载流操作符的原型:
ostream& operator << (ostream& os, ClassType& ct);
istream& operator >> (istream& is, ClassType& ct);

现在来说说标题所指,重载流操作符时不能为虚函数.为什么呢,因为重载流操作符不应该是类的成员函数,而应该把它们声明为友元,既然不能是成员函数,自然就不能是虚函数.都知道C++的每个类的对象都包含有一个隐藏的this指针,指向对象本身,假设把重载流操作符的函数声明为类的成员函数,如下:
class Demo
{
public:
   ostream& operator << (ostream& os);
   istream& operator >> (istream& is);
};
在调用的时候编译器会把上面的函数理解成
ostream& operator << (this, ostream& os);
istream& operator >> (Demo*, istream& is); //与this等同
很明显这与我们上面所说的约定不同.

现设计两个类,其中class Derived : public Base.我们希望能够像使用简单数据类型那样输出对象,cout << aBase << aDerived.而上面说了,重载流操作符时不能为虚函数,如果不能是虚成员函数,有没有办法实现多态性呢?通过一些小技巧,还是可以实现的,即简单地让重载流操作符调用该类的另一个虚函数.下面是简单的代码实现

#include <iostream>

using namespace std;


class Base
{
private:
    int x;
    friend ostream& operator << (ostream& os, Base& theBase)
    {
        theBase.print(os);
        return os;
    }

public:
    Base() {}
    Base(int a) : x(a) {}

    virtual void print(ostream& os)
    {
        os << "Base.x = " << x;
    }
}; // end class Base definition

class Derived : public Base
{
private:
    int y;

public:
    Derived(int b) : y(b) {}

    virtual void print(ostream& os)
    {
        os << "Derived.y = " << y;
    }
}; // end class Derived definition


int main()
{
    Base* pb;

    pb = new Base(10);
    cout << *pb << endl;
    delete pb;

    pb = new Derived(20);
    cout << *pb << endl;
    delete pb;
    
    return 0;
}

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为畅享7黑屏怎么办 华为畅玩7x黑屏怎么办 华为手机打电话时黑屏怎么办 三星a8手机黑屏打不开怎么办 华为手机恢复出厂后黑屏怎么办 华为荣耀4c白屏怎么办 华为荣耀6手机信号不好怎么办 华为荣耀8手机音量小怎么办 无法激活触控id怎么办 魅蓝2卡顿怎么办 小米max2玩王者荣耀卡怎么办 小米4玩王者荣耀卡怎么办 华为荣耀7i卡顿怎么办 华为荣耀7卡的怎么办 荣耀8手机有孤独怎么办 红米note4玩游戏卡怎么办 红米note4x玩游戏卡怎么办 华为4c死屏怎么办 华为4c充电很慢怎么办? 华为4c突然死机了怎么办 华为畅玩4c内存不足怎么办 荣耀4c一直亮屏怎么办 华为手机返回键失灵怎么办 荣耀6p死机了怎么办 荣耀6主板烧坏了怎么办 虚拟运营商倒闭了号怎么办 买到二次放号怎么办 新运动鞋鞋穿着有点紧怎么办 一件代发被买家退货后怎么办? 洗了翻毛的鞋子怎么办 猫眼竹芋泡根了怎么办 双线花叶子卷了怎么办 华为云收藏满了怎么办 小米6云空间满了怎么办 华为云存储已满怎么办 苹果云备份空间不足怎么办 oppor9指纹与密码忘记怎么办 oppo显示密码格式不对怎么办 oppo云服务密码忘了怎么办 小米云内存满了怎么办 id储存空间满了怎么办