【MyCpp_2.1】多态浅窥——运算符重载

本文介绍面向对象编程中的多态概念及其四种类型,并通过具体示例详细讲解了运算符重载的方法与技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态

1.多态性(前言)

1.1简述

多态(Polymorphism)字面意思是“多种状态”,即一个接口有多种方法

引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简而言之,父类的指针指向子类 的一系列操作。

1.2类型

面向对象的多态有4类:重载多态,强制多态,包含多态,参数多态
重载函数实现了重载多态,而运算符号的重载也是重载多态的一种。
强制多态是借由类型的强制转化变成符合要求的参数实现的多态。
包含多态不同类中,同名成员函数的多态实现,主要由虚函数实现。
而参数多态与类模板联系。

1.3绑定

从多态接口,或是说同名函数的调用处到该函数的实现的连接, 该确认的过程 绑定。
标识符(函数名)–>存储地址 联系起来
实现有两种:编译时 和 运行时
而编译时的绑定称为静态绑定,运算时的称为动态绑定。

2.运算符重载

重载是多态性的常用体现,而不光函数重载,还有运算符的重载。

要求:
只能对已有的运算符重载。
不改变符号优先级和结合性。
不改变操作数个数,且至少有一个是自定义类,最好也保持或是与符号原功能相似。
同时”.” , “::” , “? :” , “.*“不能重载。

返回类型 operator 运算符 (形参表)
{
    函数体
}
//成员函数和非成员函数相同结构

结构虽然相同,但成员函数会省略左边的操作数,默认为本类this,而非成员需要写全。

基于Point的列子

class Point
{
public:
    int x, y;
public:
    Point() {}
    Point(int x, int y) :x(x), y(y) {}
    Point(Point &p) :x(p.x), y(p.y) {}
    virtual ~Point() {}

    Point operator + (const Point &p)const //对Point重载+运算符实现加法
    {
        return Point(x + p.x, y + p.y);
    }

    Point operator - (const Point &p)const //对Point重载-运算符实现减法
    {
        return Point(x - p.x, y - p.y);
    }

    friend bool operator ==(const Point &p1, const Point &p2);//友元
非成员函数 重载‘==’

    Point & operator ++() { x++; y++; return *this; }//前置运算符++
    Point operator ++(int) { Point old = *this; ++*this; return old; }//后置运算符++


};

bool operator ==(const Point &p1, const Point &p2)////友元
非成员函数 重载‘==’
{
    return(p1.x == p2.x&&p1.y == p2.y);
}




//main.cpp

#include <iostream>
#include <stdio.h>
using namespace std;
/* 前置--,非成员函数的重载  */
Point operator -( Point &p)
{
    -p.x;
    -p.y;
    return p;
}
/* 后置--,非成员函数的重载  */
Point operator --(Point p, int)// 这里无形参名的“int”只是一个“符号”,标志着为后置的
{
    Point old = p;
    p.x--;
    p.y--;
    return old;
}

/*  +=的重载  */
Point operator +=(Point &p1, const Point &p2)
{
    p1 = p1 + p2;
    return p1;
}
/*<<的重载*/
ostream & operator <<(ostream &out, const Point &p)
{
    out << p.x << " , " << p.y;
    return out;
}
/*>>的重载*/
istream & operator >>(istream &in, Point &p )
{
    in >> p.x >> p.y;
    return in;
}

ps:注意函数中的const和&,const意义在于保护,而&在于提高效率意义,也符合函数参数或返回的逻辑,如:

Point & operator ++() { x++; y++; return *this; }//前置运算符++

成员函数的“–”前置运算符的重载,返回引用
特别的
这里无形参名的“int”只是一个“符号”,标志着为后置的,

Point operator --(Point p, int)// 这里无形参名的“int”只是一个“符号”,标志着为后置的
{
    Point old = p;
    p.x--;
    p.y--;
    return old;
}
### C++中的多态、继承和运算符重载的概念及用法详解 #### 1. 多态的概念及实现 多态性是指同一个接口,具有多种不同的实现方式[^2]。在C++中,多态可以通过虚函数实现。虚函数允许函数调用与函数体的联系在运行时才进行,称为动态编联[^5]。通过基类指针或引用调用派生类的不同实现版本,可以实现运行时多态。 以下是一个简单的示例: ```cpp #include <iostream> using namespace std; class Animal { public: virtual void sound() { cout << "Animal makes a sound" << endl; } // 虚函数 }; class Dog : public Animal { public: void sound() override { cout << "Dog barks" << endl; } // 派生类重写虚函数 }; class Cat : public Animal { public: void sound() override { cout << "Cat meows" << endl; } // 派生类重写虚函数 }; void makeSound(Animal* animal) { animal->sound(); // 动态绑定 } int main() { Animal* a1 = new Dog(); Animal* a2 = new Cat(); makeSound(a1); // 输出 "Dog barks" makeSound(a2); // 输出 "Cat meows" delete a1; delete a2; return 0; } ``` #### 2. 继承的使用方法 继承是C++面向对象编程的核心概念之一,用于扩展已存在的代码,从而实现代码重用[^2]。C++支持单继承和多继承,但多继承可能导致二义性问题。为了解决二义性问题,可以使用虚继承[^1]。 以下是一个虚继承的示例: ```cpp #include <iostream> using namespace std; class Base { public: int value; }; class DerivedA : virtual public Base {}; // 虚继承 class DerivedB : virtual public Base {}; // 虚继承 class DerivedC : public DerivedA, public DerivedB {}; int main() { DerivedC obj; obj.value = 10; // 共享同一块数据 cout << obj.DerivedA::value << endl; // 输出 10 cout << obj.DerivedB::value << endl; // 输出 10 return 0; } ``` #### 3. 运算符重载的使用方法 运算符重载允许用户自定义运算符的行为,使得操作更加直观和简洁[^3]。运算符重载可以通过成员函数或友元函数实现。对于单目运算符,通常将其重载为成员函数;对于双目运算符,可以重载为成员函数或友元函数。 以下是一个运算符重载的示例: ```cpp #include <iostream> using namespace std; class Vector { public: int x, y; Vector(int x_val = 0, int y_val = 0) : x(x_val), y(y_val) {} // 重载加号运算符 Vector operator+(const Vector& vec) const { return Vector(x + vec.x, y + vec.y); } // 重载输出运算符 friend ostream& operator<<(ostream& os, const Vector& vec) { os << "(" << vec.x << ", " << vec.y << ")"; return os; } }; int main() { Vector v1(1, 2); Vector v2(3, 4); Vector v3 = v1 + v2; // 使用重载的加号运算符 cout << v3 << endl; // 输出 "(4, 6)" return 0; } ``` #### 注意事项 - 静态联编和动态联编分别表示在编译时和运行时确定调用的函数。 - 构造函数不能是虚函数,析构函数可以是虚函数[^5]。 - 纯虚函数需要在派生类中实现,含有纯虚函数的类称为抽象类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值