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 后,仍可为其提供类外实现(属于基类作用域)但派生类必须重写该函数以消除抽象性。
- 无论是在抽象类作用域下实现的纯虚函数还是派生类作用域下实现的纯虚函数,都可(显示)调用。
注意:抽象基类本身不可实例化,纯虚函数的类外实现只能通过派生类对象显式调用(如 派生类对象->基类::纯虚函数())。