c++中子类重写父类虚函数

本文探讨C++中子类如何重写父类虚函数,涉及早绑定和晚绑定的概念。动态多态的实现依赖于虚函数,需满足特定条件:子类继承父类并重写虚函数。通过分析虚函数表,解释了重写过程中函数地址的变化,强调了函数名、参数列表和返回值需一致的重要性。

本篇文章来讨论一下什么是子类重写父类函数的底层概念。写的不好的地方,敬请多多指正~

一、函数地址绑定

1、早绑定

先来看一段代码:

 class Animal//创建动物类(父类)
{
   
   
public:
	void Speak()
	{
   
   
		cout << "动物在说话" << endl;
	}
};

class Cat :public Animal//创建子类(猫),并继承父类
{
   
   
public:
	void Speak()
	{
   
   
		cout << "小猫在说话" << endl;
	}
};

//C++中允许父类和子类之间的类型转换,并且不需要进行强制类型转换,所以父类的引用或指针可以直接指向子类
void doSpeak(Animal& a)//将c传进来后,相当于Animal& animal = c
{
   
   
	a.Speak();
}

void test()
{
   
   
	Cat c;//创建子类对象
	d
<think>好的,我现在要回答用户关于C++中子如何继承和重写父类函数的问题。首先,我需要回顾一下用户提供的引用内容,确保答案准确。 根据引用[2],C++中如果父类的函数是虚函数,子重写时会覆盖父类的函数;如果非虚函数,子同名函数会隐藏父类的函数,但可以通过作用域运算符显式调用。引用[3]提到,如果子没有重写父类的成员函数,那么子会继承并使用父类的函数,且它们在代码段共享同一内存。 接下来,我需要整理继承和重写的步骤。首先,子继承父类时使用public继承,然后在子中声明同名函数。对于虚函数,需要使用override关键字(C++11之后),并确保函数签名一致。如果父类函数不是虚函数,子可以通过作用域运算符调用父类版本。 用户可能需要示例代码来理解具体实现。需要给出一个父类和子的例子,展示继承和重写的情况,以及如何显式调用父类函数。同时,要区分虚函数和非虚函数的处理方式。 此外,需要说明内存中的情况,如引用[3]所述,未重写的函数在代码段共享内存。这可能涉及函数指针和虚函数表的概念,但用户可能不需要太深入,保持简洁即可。 最后,生成相关问题时要围绕继承、虚函数、作用域调用等方面,帮助用户进一步学习。比如,虚函数的作用、构造函数继承等。 检查是否有遗漏点,比如构造函数继承的问题,引用[1]提到子通过初始化列表调用父类构造函数,但用户的问题是函数继承,可能不需要深入构造函数部分,但可以简要提及。 确保语言口语化,避免术语堆砌,结构清晰,分点说明。代码示例正确,符合C++标准,比如使用override关键字,正确的作用域解析。</think>在C++中,子继承和重写父类函数的过程涉及以下几个关键点: ### 一、基础继承规则 1. **公开继承**:使用`class Child : public Parent`语法实现父类成员的完全继承 2. **函数可见性**: - 父类的非虚函数会被子继承,但可能被隐藏(如果子有同名函数) - 父类虚函数(`virtual`修饰)允许子进行覆盖(override) ### 二、函数重写实现方法 ```cpp class Parent { public: virtual void func() { // 虚函数声明 cout << "Parent function" << endl; } }; class Child : public Parent { public: void func() override { // 使用override确保正确重写 cout << "Child override" << endl; } }; ``` *输出结果:* ``` Child override ``` ### 三、非虚函数的处理 ```cpp class Parent { public: void nonVirtualFunc() { cout << "Parent non-virtual" << endl; } }; class Child : public Parent { public: void nonVirtualFunc() { // 隐藏父类同名函数 cout << "Child new function" << endl; } }; // 调用示例 Child c; c.nonVirtualFunc(); // 输出Child版本 c.Parent::nonVirtualFunc(); // 显式调用父类版本[^2] ``` ### 四、内存机制 1. **未重写函数**:父类函数代码段内存被子共享,不会产生副本[^3] 2. **虚函数覆盖**:通过虚函数表(vtable)实现动态绑定,子虚函数会覆盖父类在虚表中的对应项[^2] ### 五、注意事项 1. **函数签名一致性**:重写虚函数必须保持参数列表和返回型一致(协变返回型除外) 2. **访问权限控制**:子可以修改继承函数的访问权限(通过using声明) 3. **构造函数调用**:子构造函数必须通过初始化列表调用父类构造函数[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值