C++重载、重写、覆盖、隐藏的区别

本文深入解析C++中的重载、重写与隐藏概念,通过具体代码示例阐述了它们的区别与应用场景,强调了virtual关键字在实现多态性中的作用。

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

  (1)重载:这个最好理解:相同函数名,函数参数类型和数量不同,注意重载并不关心还回值类型,此外重载必须是在同一个类中

(2)重写、覆盖是同一个东西:都是在继承和派生的时候才可能出现的情况,重写(覆盖)是指在派生类中存在重新定义函数,其函数名、参数类型和数量必须与基类中的函数保持一致,只有函数体(也就是花括号里面的内容)不同。重写的函数必须要有virtual关键字修饰,否则不能称之为重写或者覆盖。

(3)隐藏也是在继承和派生的时候才可能出现的情况,隐藏是指派生类的函数屏蔽了其基类的函数,注意只要派生类中函数名与基类中函数名相同,基类函数都会被隐藏。注意:隐藏方法无法实现多态性。

下面的例子证实了这一点:

class Base
{
public:
	void fun(int,double) { cout << "Base::fun(int,double)" << endl; }
};
class Derive : public Base
{
public:
	void fun(int) { cout << "Derive::fun(int)" << endl; }
};


int main()
{
	Derive pd;
	pd.fun(1);//Derive::fun(int )
	pd.fun(0.01, 1);//错误:fun函数被隐藏

	Base *fd = &pd;
	fd->fun(1.0, 1);//正确,隐藏不能实现多态性 Base::fun(double ,int);
	fd->fun(1);//隐藏不能实现多态,所以是错的
	return 0;
}

总结:举个例子看看

class Base
{
public:
    virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
    void g(float x){ cout << "Base::g(float) " << x << endl; }
    void h(float x){ cout << "Base::h(float) " << x << endl; }
};

class Derived : public Base
{
public:
    virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
    void g(int x){ cout << "Derived::g(int) " << x << endl; }
    void h(float x){ cout << "Derived::h(float) " << x << endl; }
};

int main(void)
{
    Derived d;
    Base *pb = &d;
    Derived *fd = &d;
    // Good : behavior depends solely on type of the object
    pb->f(3.14f); //Derived::f(float) 3.14
    fd->f(3.14f); //Derived::f(float) 3.14

    // Bad : behavior depends on type of the pointer
    pb->g(3.14f); //Base::g(float) 3.14
    fd->g(3.14f); //Derived::g(int) 3

    // Bad : behavior depends on type of the pointer
    pb->h(3.14f); //Base::h(float) 3.14
    fd->h(3.14f); //Derived::h(float) 3.14

    system("pause");
    return 0;
}

(1)f是覆盖或者重写, 不是重载

(2)g是隐藏不是重载和覆盖,因为不在一个类并且不是没有virtual关键字修饰

(3)h是隐藏不是重载和覆盖,因为不在一个类并且不是没有virtual关键字修饰

本文代码引用自这篇博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值