在C++中,抽象类是含有抽象函数的类,也就是带有纯虚函数的类就是抽象类。
抽象类的最大特点就是不能够实例化对象,也就是不能定义抽象类的对象。就是说,我们不能够直接在主函数去实例化进行赋值使用抽象方法中所定义的参数变量。
#include<iostream>
using namespace std;
class Stu
{
public:
virtual void Show(string name,int a)=0;//使用纯虚函数定义抽象方法
private:
string m_name;
int age;
};
void Stu::Show(string name,int a)
{
m_name = name;
a = age;
}
int main()
{
Stu s;
s.Show("Zhan",18);//试图使用抽象类进行实例化
return 0;
}
在这个代码中,Stu这个类,就是一个抽象类,因为在这个类中有用到纯虚函数的关键字所定义的抽象方法,也就是Show。纯虚函数是不能够被实例的,当被实例化的时候结果会怎么样?
直接使用抽象方法来实例化是错误的。那使用抽象类中的普通方法会怎么样?
#include<iostream>
using namespace std;
class Stu
{
public:
virtual void Show(string name,int a)=0;
int Sum(int b,int c);
private:
int m;
int g;
};
int Stu::Sum(int b,int c)
{
m = b;
g = c;
return m+g;
}
int main()
{
Stu s;
s.Sum(2,6);
return 0;
}
结果如下:
很显然,通过接过来看,不论是抽象方法也好还是抽象类中的普通方法也好,它只要是抽象类,那么就不能够用来定义对象,更不能实例化对象。
那么通过子类继承抽象类,看能不能进行对象的实例化?
#include<iostream>
using namespace std;
class Stu
{
public:
virtual void Show()=0;//使用纯虚函数定义抽象方法
private:
int a;
int b;
};
class Name:public Stu
{
public:
void Show();
private:
int m_c;
int m_d;
};
void Name::Show()
{
cout<<"Show"<<endl;
}
int main()
{
Name s;
s.Show();
return 0;
}
继承了抽象类的子类,同样继承了抽象类的特性。虽然子类中的Show是没设成纯虚方法,但是由于因为子类的继承特性,就相当于现在的这个Show与Stu这个基类中的Show是同名同参的,起到了覆盖的关系,当子类中的方法可以覆盖抽象类中的抽象方法的时候就可以实例化子类中的对象。就直接打印出结果。
当所有的都不改变,只在Stu这个抽象类中多加入一个抽象方法的话,会怎么样?
class Stu
{
public:
virtual void Show()=0;//使用纯虚函数定义抽象方法
virtual void Add(int a,int b) = 0;
private:
int a;
int b;
};
通过结果来看,就是当子类继承抽象类的时候,也会继承它所有的抽象方法及特性,除非要把所继承来的抽象方法全部在子类中以函数或者虚函数的方式替代掉并且进行函数的实现,不然子类
也不能够实例化。
以下代码是以虚函数的方式进行替换并实现。
#include<iostream>
using namespace std;
class Stu
{
public:
virtual void Show()=0;//使用纯虚函数定义抽象方法
virtual void Add(int a,int b) = 0;
private:
int a;
int b;
};
class Name:public Stu
{
public:
virtual void Add(int c,int d);
virtual void Show();
private:
int m_c;
int m_d;
};
void Name::Add(int c,int d)
{
m_c = c;
m_d = d;
cout<<c<<" "<<d<<endl;
}
void Name::Show()
{
cout<<"Show"<<endl;
}
int main()
{
Name s;
s.Add(3,9);
s.Show();
return 0;
}
结果:
所以总的来说,一个含有纯虚函数的抽象类,是无法进行实例化的,不能够定义对象。但是当使用子类来继承抽象类的时候,只有在子类中全部都实现了对基类中的抽象方法的覆盖实现。才能够对子类进行实例化,否则不能进行实例化以及定义对象。