【C++】纯虚函数类外可以写实现吗?

1. 答案

  • 先说答案,可以

2.代码测试

.h头文件

#include <iostream>
#include <string>

// 抽象基类
class AbstractBase
{
public:
	AbstractBase() = default;
	virtual ~AbstractBase() = default;	// 默认析构函数

public:
	virtual int PureVirtualFunction() = 0; // 纯虚函数声明
};

// 基类
class Derived : public AbstractBase
{
public:
	Derived(){};
	~Derived(){};
public:
	virtual int DerivedVirtualFunction();	// 虚函数声明

	int PureVirtualFunction() override; // 必须重写父类纯虚函数
	//{
	//	std::cout << "This is Derived class, not is abstract class." << std::endl;
	//	return 0;
	//}		// 在派生类内重写实现也可以

private:

};

.cpp源文件

#include <iostream>

#include "00 StudyTest.h"

// 纯虚函数类外实现
int AbstractBase::PureVirtualFunction()
{
	std::cout << "PureVirtualFunciton() out of class print result." << std::endl;
	return 0;
}

// 普通虚函数类外实现
int Derived::DerivedVirtualFunction()
{
	std::cout << "DerivedVirtualFunction() print result." << std::endl;
	return 0;
}
// 必须重写父类纯虚函数
int Derived::PureVirtualFunction()
{
	std::cout << "This is Derived class, not is abstract class." << std::endl;
	return 0;
}

int TestFunction_6()
{
	// 普通虚函数
	Derived *pCDerivedPoint = new Derived();
	pCDerivedPoint->DerivedVirtualFunction();
	// 纯虚函数
	pCDerivedPoint->PureVirtualFunction();					// 默认调用派生类重写后的纯虚函数
	pCDerivedPoint->AbstractBase::PureVirtualFunction();	// 可以显示调用抽象类的纯虚函数实现

	delete pCDerivedPoint;
	pCDerivedPoint = nullptr;

	return 0;
}


int main()
{
	std::cout << "The program begins." << std::endl << "--------------------" << std::endl;
	
	// 6.1 普通虚函数类外可以写实现吗(即函数体)?写代码验证。
	// 6.2 纯虚函数类外可以写实现吗(即函数体)?写代码验证。
	TestFunction_6();		// 答:普通虚函数类外可以写实现。纯虚函数也可以在类外写实现。并且两者都可以被调用。
	

	system("pause");
	return 0;
}

打印结果:
在这里插入图片描述

3. 总结

本文目的:验证虚函数和纯虚函数在类外实现的可行性。
代码测试表明:

  • 普通虚函数可以在类外实现;
  • 纯虚函数在基类中声明为 =0 后,仍可为其提供类外实现(属于基类作用域)但派生类必须重写该函数以消除抽象性。
  • 无论是在抽象类作用域下实现的纯虚函数还是派生类作用域下实现的纯虚函数,都可(显示)调用。

注意:抽象基类本身不可实例化,纯虚函数的类外实现只能通过派生类对象显式调用(如 派生类对象->基类::纯虚函数())。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值