C++中重载、重写、重定义

本文介绍了C++中的三种概念:重载、重写和重定义。重载发生在同一作用域内,函数名相同但参数列表不同,如构造函数和拷贝构造函数的重载。重写(覆盖)发生在基类和派生类之间,函数名、参数列表和返回值相同,基类成员函数需为virtual。重定义则是在不同作用域中,函数名不同,如基类和派生类中同名成员的处理。

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

重载:
1>作用域相同。
2>函数名相同,参数列表不同。
3>与返回值无关。
例:同一个类的构造函数和拷贝构造函数构成重载。

class A
{
    A()
    {}

    A(const A& a)
    {}
};

重写(覆盖):
1>不在同一作用域(分别为基类和派生类)。
2>函数名相同,参数列表相同,返回值相同。
3>基类成员函数必须有virtual关键字修饰。
4>访问修饰符可以不同。
例:

class person
{
public:
    virtual void BuyTickets()
    {
        std::cout << "全价票" << std::endl;
    }
};

class student :public person
{
public:
    void BuyTickets()
    {
        std::cout << "半价票" << std::endl;
    }
};

我们在用基类的指针或者引用访问student类时,这时候调用的是student类的方法。

int main()
{
    person p;
    student s;
    person* ptr = &s;
    ptr->BuyTickets();

    person& stu = s;
    stu.BuyTickets();
    return 0;
}

输出结果,说明person类中的方法已经被重写。
这里写图片描述

重定义(隐藏):
1>不在同一作用域(分别为基类和派生类)。
2>函数名不同。
3>在基类和派生类中只要不构成重写就是重定义
例:

class A
{
public:
    void fun(int a)
    {
        std::cout << "A" << std::endl;
    }
};

class B:public A
{
public:
    void fun(double b)
    {
        std::cout << "B" << std::endl;
    }
};

当A类中和B类中拥有相同名称的成员时,B继承A。那么在B类实例化之后想要调用A中相同名称的成员,需要加上作用域解析符。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值