c++类的函数重载、重写示例

本文通过具体的C++代码示例,展示了基类与派生类的关系,以及虚函数如何实现多态性。探讨了不同情况下构造函数、析构函数的调用顺序,并演示了如何通过指针调用虚函数。

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

1、文件cls.h
头文件cls.h实现了基类Base1、Base2,和子类Derived1、Derived2。

#pragma once
#include <iostream>
using namespace std;

class Base1
{
public:
	Base1() { cout << "Constrution Base1" << endl; }
	//~Base1() { cout << "Destrution Base1" << endl; }

	virtual ~Base1() { cout << "Destrution Base1" << endl; }

	virtual void f() { cout << "Base1::f" << endl; }

	virtual void g() { cout << "Base1::g" << endl; }

	virtual void h() { cout << "Base1::h" << endl; }

	void func(){ cout << "Base1::func" << endl; }
};

class Base2
{
public:
	Base2() { cout << "Constrution Base2" << endl; }
	//~Base2() { cout << "Destrution Base2" << endl; }

	virtual ~Base2() { cout << "Destrution Base2" << endl; }
	
	virtual void f() { cout << "Base2::f" << endl; }

	virtual void g() { cout << "Base2::g" << endl; }

	virtual void h() { cout << "Base2::h" << endl; }

	void func() { }
};

class Derived1 :public Base1
{
public:
	Derived1() { cout << "Constrution Derived1" << endl; }
	~Derived1() { cout << "Destrution Derived1" << endl; }

	virtual void f() { cout << "Derived1::f" << endl; }   // virtual可写可不写

	virtual void g1() { cout << "Derived1::g1" << endl; }

	virtual void h1() { cout << "Derived1::h1" << endl; }

	void func() { cout << "Derived1::func" << endl; }

};

class Derived2 :public Base2, public Base1
{
public:
	Derived2() { cout << "Constrution Derived2" << endl; }
	~Derived2() { cout << "Destrution Derived2" << endl; }

	virtual void f()  { cout << "Derived2::f" << endl;  }

	virtual void g1() { cout << "Derived2::g1" << endl; }

	virtual void h1() { cout << "Derived2::h1" << endl; }
};

2、主函数
测试函数的派生、虚函数重写、重载等示例。

#include "cls.h"

int main()
{
	Base1 b1;
	Base2 b2;
	Derived1 d1;
	Derived2 d2;
	// 大小与函数列表有关
	cout << "sizeof(Base1) = " << sizeof(Base1) << " sizeof(b1) = " << sizeof(b1) << endl;
	cout << "sizeof(Base2) = " << sizeof(Base2) << " sizeof(b2) = " << sizeof(b2) << endl;
	cout << "sizeof(Derived1) = " << sizeof(Derived1) << " sizeof(d1) = " << sizeof(d1) << endl;
	cout << "sizeof(Derived2) = " << sizeof(Derived2) << " sizeof(d1) = " << sizeof(d1) << endl;

	Derived1 d;  // d 能直接调用Derived1的所有函数、Base1的非虚函数,间接调用base1的虚函数
	d.f();        // Derived::f
	d.g1();		  // Derived::g1
	d.Base1::f(); // Base1::f 
	d.func();

	Derived1 *d = new Derived1(); // 同上
	d->f();	         // Derived::f
	d->g1();		 // Derived::g1
	d->Base1::f();   // Base1::f
	d->func();		 // Derived1::func   重载
	d->Base1::func();// Base1::func		 间接调用,显示调用

	Base1 *b = new Derived1(); // b 只能调用Base1的函数,但是虚函数会被动态绑定
	b->f();		// Derived1::f 
	b->g();		// Base1::g
	b->func();	// Base1::func

	Base1 *b = new Base1(); // 显然只能调用base1的函数
	b->f();   // Base1::f
	b->g();   // Base1::g
	b->func();// Base1::func

	
	Base1 *b = new Base1(); 
	delete b; // 不论基类析构函数是否为虚函数,都会执行函数体

	Base1 *b = new Derived1(); 
	delete b; // 当基类析构函数为虚时,才会析构父类;    否则,只执行基类的析构函数

	Derived1 *d = new Derived1();
	delete d;	// 不论基类析构函数是否为虚函数,都会执行函数体



	Derived2 d2;//直接调用Derived2的函数,间接调用父类函数
	d2.f();         // Derived2::f
	d2.Base1::f();  // Base1::f
	d2.Base2::f();  // Base2::f

	Derived2 *d2 = new Derived2();//直接调用Derived2的函数,间接调用父类函数
	d2->f();        // Derived2::f
	d2->Base1::f(); // Base1::f
	d2->Base2::f(); // Base2::f
	delete d2;

	Base1 *d2 = new Derived2();// 调用base1的函数和Derived2重写的函数,
	d2->f();		    // 子类重写 Derived2::f
	d2->Base1::f();   // 间接调用父类虚函数 Base1::f    
	d2->g();		    // 直接调用父类虚函数 Base1::g    
	d2->func();		// 直接调用父类非虚函数 Base1::func
	delete d2;        //其中一个父类析构函数必须为虚函数

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aworkholic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值