C++ | 子类对象调用父类函数

在C++中子类对象调用父类函数可通过域操作符(::)来实现,表明所调用函数的作用域。

//test.cc
#include <iostream>
using namespace std;
class A
{
public:
	virtual void func()
	{
		cout <<" this is A" << endl;
	}
};

class B : public A
{
public:
	virtual void func()
	{
		cout <<" this is B" << endl;
	}
};

int main()
{
	A a;
	B b;
	A* c = new B(); 
	a.func();     //this is A
	b.func();     //this is B
	b.A::func();  //this is A
	c->func();    //this is B
	c->A::func(); //this is A
	return 0;
}

 输出如下图:

在上面的列子中,函数func()是否是虚函数对a、b的调用没有影响;指针c是一个指向子类的父类指针,当其直接调用函数func()时,由于func()是虚函数,根据虚函数表的定义,子类的func()将覆盖父类的func()。

<think>好的,我现在要回答用户的问题:“C++子类怎么调用父类函数”。首先,我需要回想一下C++中继承的基本概念和相关语法。用户可能是一个刚开始学习C++的开发者,对面向对象编程中的继承机制还不熟悉,需要指导如何让子类调用父类的方法。 首先,我应该考虑子类继承父类的方式,比如公有继承、保护继承或私有继承。通常,最常见的是公有继承,所以可能需要先说明这种情况。然后,在子类调用父类函数的方法可能包括直接调用、使用作用域解析运算符,或者在子类覆盖父类函数时如何显式调用父类版本。 接下来,我需要分步骤解释不同的情况。例如,当子类没有覆盖父类函数时,可以直接调用。如果子类覆盖了函数,就需要使用父类名加作用域运算符来指定调用父类的方法。另外,构造函数和析构函数调用方式可能不同,特别是构造函数初始化列表中的使用。 还需要注意,用户可能会遇到多重继承的情况,这时候调用父类函数可能需要更明确的路径,避免歧义。不过,用户的问题可能更关注单继承的情况,所以可能需要先重点讲解单继承,再简要提及多重继承的情况。 此外,应该提供具体的代码示例,这样用户可以更直观地理解如何实现。例如,展示一个父类子类的简单例子,演示直接调用和使用作用域运算符的情况。同时,要确保代码语法正确,符合C++标准,比如使用正确的继承语法和函数调用方式。 可能还需要提醒用户一些常见的错误,比如忘记使用作用域运算符导致递归调用自身,或者在构造函数中正确初始化父类部分。此外,可以提到C++11引入的override关键字,帮助防止错误的重写,但这可能稍微超出当前问题的范围,但作为补充信息可能会有帮助。 最后,总结关键点,帮助用户记忆和应用。确保回答结构清晰,步骤明确,覆盖不同情况,并提供示例代码和注意事项,这样用户能够全面理解如何在C++子类调用父类函数。</think>在C++中,子类调用父类函数主要有以下4种场景,我们通过具体示例逐步说明: 1. **直接调用(未覆盖父类函数时)** ```cpp class Base { public: void show() { std::cout << "Base class\n"; } }; class Derived : public Base { public: void display() { show(); // 直接调用继承的父类函数 } }; ``` 2. **使用作用域解析运算符(覆盖父类函数时)** ```cpp class Base { public: void print() { std::cout << "Base print\n"; } }; class Derived : public Base { public: void print() { Base::print(); // 明确调用父类版本 std::cout << "Derived print\n"; } }; ``` 3. **构造函数链式调用** ```cpp class Parent { public: Parent(int x) { std::cout << "Parent constructor: " << x << "\n"; } }; class Child : public Parent { public: Child(int y) : Parent(y) { // 在初始化列表中调用父类构造函数 std::cout << "Child constructor\n"; } }; ``` 4. **多重继承的情况** ```cpp class Father { public: void work() { std::cout << "Father working\n"; } }; class Mother { public: void work() { std::cout << "Mother working\n"; } }; class Son : public Father, public Mother { public: void doWork() { Father::work(); // 明确指定调用哪个父类 Mother::work(); } }; ``` **注意事项:** - 使用作用域解析运算符`::`是强制调用父类版本的关键 - 构造函数必须在初始化列表中调用父类构造函数 - 当存在多重继承时,必须明确指定父类名称 - 建议使用`override`关键字确保正确重写: ```cpp class Base { public: virtual void func() {} }; class Derived : public Base { public: void func() override { Base::func(); // 调用父类实现 // 新增逻辑 } }; ``` **调用优先级:** 1. 子类自身成员函数 2. 直接父类成员函数 3. 更上层父类成员函数 通过合理使用这些方法,可以实现父子类之间的有效协作,既保持代码复用性,又能实现多态特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值