虚函数vitural

本文通过两个示例对比了在C++中使用与未使用虚函数时,基类指针删除派生类对象的行为差异。展示了虚析构函数如何确保正确调用派生类的析构函数,避免资源泄露。

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

1)没有使用vitual

#include <iostream>

using namespace std;

class Base
{
public:
	Base()
	{
		cout << "Base::Base()" << endl;
	}
	~Base()
	{
		cout << "Base::~Base()" << endl;
	}
};

class Sub : public Base
{
public:
	Sub()
	{
		cout << "Sub::Sub()" << endl;
	}
	~Sub()
	{
		cout << "Sub::~Sub()" << endl;
	}
};

int main(void)
{
	Base *m_pBase = (Base*)new Sub();
	delete m_pBase;
	Sub *m_pSub = (Sub*)new Base();
	delete m_pSub;
	return 0;
}

Base *m_pBase = (Base*)new Sub();命令显示:

Base::Base()

Sub::Sub()

delete m_pBase;命令显示

Base::~Base()

Sub *m_pSub = (Sub*)new Base();命令显示:

Base::Base()

delete m_pSub;命令显示:

Sub::~Sub()

Base::~Base()


2)虚函数vitual

#include <iostream>

using namespace std;

class Base
{
public:
	Base()
	{
		cout << "Base::Base()" << endl;
	}
	virtual ~Base()
	{
		cout << "Base::~Base()" << endl;
	}
};

class Sub : public Base
{
public:
	Sub()
	{
		cout << "Sub::Sub()" << endl;
	}
	virtual ~Sub()
	{
		cout << "Sub::~Sub()" << endl;
	}
};

int main(void)
{
	Base *m_pBase = (Base*)new Sub();
	delete m_pBase;
	Sub *m_pSub = (Sub*)new Base();
	delete m_pSub;
	return 0;
}
显示结果:


Base *m_pBase = (Base*)new Sub();命令显示:

Base::Base()

Sub::Sub()

delete m_pBase;命令显示

Sub::~Sub()

Base::~Base()

Sub *m_pSub = (Sub*)new Base();命令显示:

Base::Base()

delete m_pSub;命令显示

Base::~Base()


在C++中,`virtual`关键字用于实现运行时多态(runtime polymorphism),这是面向对象编程的核心特性之一。通过虚函数,程序可以在运行时根据对象的实际类型来调用相应的函数,而不是仅仅依赖于指针或引用的静态类型。 ### 虚函数的含义 当一个成员函数被声明为`virtual`时,它就成为了虚函数虚函数允许派生类提供该函数的具体实现,而这些实现可以通过基类的指针或引用来访问。这种机制确保了即使通过基类接口调用函数,也能正确地调用到最具体的实现。 ### 虚函数的作用 - **支持多态行为**:使得可以通过基类的指针或引用调用派生类的函数。 - **提高代码灵活性和可扩展性**:新增派生类不需要修改使用基类接口的现有代码。 - **促进代码重用**:基类可以定义默认行为,派生类可以选择继承这个行为或者提供自己的实现[^1]。 ### 使用示例 下面是一个简单的例子,演示如何在C++中使用虚函数: ```cpp #include <iostream> using namespace std; // 基类 class Base { public: // 声明虚函数 virtual void show() const { cout << "Base class show function." << endl; } }; // 派生类 class Derived : public Base { public: // 重写基类中的虚函数 void show() const override { cout << "Derived class show function." << endl; } }; int main() { Base base; Derived derived; // 通过基类指针调用虚函数 Base* ptr = &base; ptr->show(); // 输出: Base class show function. // 改变指针指向派生类对象 ptr = &derived; ptr->show(); // 输出: Derived class show function. return 0; } ``` 在这个例子中,`Base`类有一个虚函数`show()`,`Derived`类重写了这个函数。当通过`Base`类型的指针调用`show()`时,实际执行的是`Derived`类的版本,这是因为`show()`是虚函数,并且指针指向的是`Derived`类的对象。 ### 注意事项 - 构造函数不能是虚函数,因为它们与特定类的实例创建相关联,但在构造过程中对象的动态类型还不确定。 - 如果基类打算作为其他类的父类并且预期会被继承,则通常应该将析构函数设为虚函数,以保证正确的析构顺序和行为[^3]。 - `override`关键字不是必须的,但它有助于编译器检查是否确实覆盖了一个虚函数,从而避免由于拼写错误导致的问题。 通过上述解释和示例,可以看到虚函数是如何在C++中启用强大的多态特性的,并且能够写出更加灵活、易于维护的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值