您的位置:首页 > 编程语言 > C语言/C++

C++ 多态性 与 虚函数

2014-05-07 09:05 225 查看
1.运算符重载

运算符重载形式:
(1)重载为类的成员函数
运算符重载函数说明为类的成员函数的格式为:
<类名>operator<运算符>(<参数表>)
如:
c1+c2
编译器将给出的解释为:c1.operator+(c2)
该运算符重载函数仅仅有一个参数,所以重载为成员函数时,双目运算符仅有一个参数。对于单目运算符,重载为成员函数时,再能再显示说明参数。重载为成员函数时,总是隐含一个参数,即this指针。 

(2)重载为友元函数

运算符重载函数说明为类的友元函数时,有两个参数,没有隐含参数。
c1+c2
编译器将给出的解释为:operator+(c1, c2)

(3)两种重载方式的比较
     一般来说,单目运算符最好被重载为成员函数,双目运算符最好能被重载为友元函数。
    在有些情况下,不便于重载为成员函数。
    如:c+1.1,这里c是complex类的对象。
    重载被表达为:c.operator+(1.1),可以调用
    complex::operator+(double d),如果没有该成员函数,可以调用如下的重载函数:
    complex::operator+(const complex &c),所以最总表达为
    c.opeartor(complex(1.1))
    如果是友元函数,则表达为
    operator+(c, complex(1.1))
    
    但是如果表达式为1.1+c
    友元函数表达为:operator+(complex(1.1), c)
    成员函数表达为:1.1.operator+(c)显然是不合适的 //????为什么不能解释为complex(1.1).operator+(c),待验证

    双目运算符赋值重载为成员函数比较合适。

虚函数

virtual<类型说明符><函数名> (<参数表>)

如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现方式。当使用这个成员函数操作指针或引用所标识对象时,对该成员函数调用采取动态编联方式,即在运行时进行关联或束定。

派生类中对基类的虚函数进行替换时,要求派生类中说明的虚函数与基类的被替换的虚函数满足如下条件:
(1)与基类的虚函数有相同的参数个数
(2)其参数的类型与基类的虚函数的对应参数类型相同
(3)其返回值或者与基类的虚函数相同,或者都返回指针和引用,并且派生类虚函数所返回的指针或者引用是基类中被替换的虚函数所返回的指针或引用的基类型的子类型。

纯虚函数
virtual<类型说明符><函数名>(<参数表>)=0
纯虚函数是在基类中不能给出有意义的实现,完全交给派生类做,带有纯虚函数的类为抽象类。

//第一阶段简要结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: