c++虚函数、纯虚函数、抽象类、虚析构函数、纯虚析构函数、虚基类
2012-08-11 18:21
260 查看
一 、C++虚函数
表达一种动态的性质:由基类指针或引用所表示的实际对象来选择所要执行的操作。
二、C++纯虚函数
实声明时“初始化”为0的虚函数。它是一个在基类中说明的虚函数,它在该基类中没有定义(即没有函数体),具体的定义由派生类去完成。
纯虚函数的定义形式是:virtual 返回类型 纯虚函数名(参数列表)=0;
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
三、抽象类:
包含(至少一个)纯虚函数的类。
由于存在纯虚函数,定义抽象类的对象是毫无意义的,因为对象的操作无法实现。
所以:抽象类只能用作其它类的基类,不能建立抽象类的对象。
抽象类视为抽象和设计的目的而建立的,在有些情况中,类层次结构顶部有好几层都是抽象类。
三、虚析构函数
解决多重继承中delete释放空间时存在的问题。
class A
{
public:
~A(){cout<<"A::~A()called.\n";}
}
class B:public A
{
public:
B(int i){buf=new char[i];}
~B()
{
delete[ ] buf;
cout<<"B::~B() called.\n"
}
private:
char *buf;
}
void main()
{
A *a = new B(15);
delete a;
}
希望结果:B::~B() called.
A::~A()called.
但程序运行结果:
A::~A()called.
四、纯虚析构函数
解决二、三的共同问题
五、虚基类
二义性问题
class B
{
public:
int b;
}
class B1:public B
{
private:
int b1;
}
class B2:public B
{
private:
int b2;
}
class C:public B1,public B2
{
public:
int f();
private:
int d;
}
下面访问出现二义性问题:
C c;
c.b
c.B::b;
下面访问是正确的:
c.B1::b
c.B2::b
虚基类的引入:用于有共同基类的场合。
定义:在继承时以virtual修饰说明基类 。例:class B1::virtual public B。
作用:主用用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题。为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。
注意:在第一级继承时就要将共同基类设计成虚基类。
表达一种动态的性质:由基类指针或引用所表示的实际对象来选择所要执行的操作。
二、C++纯虚函数
实声明时“初始化”为0的虚函数。它是一个在基类中说明的虚函数,它在该基类中没有定义(即没有函数体),具体的定义由派生类去完成。
纯虚函数的定义形式是:virtual 返回类型 纯虚函数名(参数列表)=0;
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
三、抽象类:
包含(至少一个)纯虚函数的类。
由于存在纯虚函数,定义抽象类的对象是毫无意义的,因为对象的操作无法实现。
所以:抽象类只能用作其它类的基类,不能建立抽象类的对象。
抽象类视为抽象和设计的目的而建立的,在有些情况中,类层次结构顶部有好几层都是抽象类。
三、虚析构函数
解决多重继承中delete释放空间时存在的问题。
class A
{
public:
~A(){cout<<"A::~A()called.\n";}
}
class B:public A
{
public:
B(int i){buf=new char[i];}
~B()
{
delete[ ] buf;
cout<<"B::~B() called.\n"
}
private:
char *buf;
}
void main()
{
A *a = new B(15);
delete a;
}
希望结果:B::~B() called.
A::~A()called.
但程序运行结果:
A::~A()called.
四、纯虚析构函数
解决二、三的共同问题
五、虚基类
二义性问题
class B
{
public:
int b;
}
class B1:public B
{
private:
int b1;
}
class B2:public B
{
private:
int b2;
}
class C:public B1,public B2
{
public:
int f();
private:
int d;
}
下面访问出现二义性问题:
C c;
c.b
c.B::b;
下面访问是正确的:
c.B1::b
c.B2::b
虚基类的引入:用于有共同基类的场合。
定义:在继承时以virtual修饰说明基类 。例:class B1::virtual public B。
作用:主用用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题。为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。
注意:在第一级继承时就要将共同基类设计成虚基类。
相关文章推荐
- 068day(虚析构函数,纯虚函数和抽象类)
- 虚函数,虚析构函数,纯虚函数,抽象类
- 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
- 【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用
- 虚函数,虚析构函数,纯虚函数,抽象类。
- 基类、派生类、虚基类、虚函数、虚析构、纯虚函数、抽象类
- 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
- 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
- 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底
- 虚函数,虚析构函数,纯虚函数,多态性,抽象类。
- C++虚函数(11) - 纯虚函数与抽象类
- 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
- 虚函数,虚析构函数,纯虚函数,抽象类
- 虚函数,虚析构函数,纯虚函数,抽象类
- 虚函数,虚析构函数,纯虚函数,抽象类
- c++虚函数纯虚函数抽象类浅析
- 多态,虚函数,纯虚函数 , 虚析构函数 ,抽象类
- C++虚函数和纯虚函数和抽象类
- 读书笔记--C++程序设计(第2版)--12多态性与虚函数(虚析构函数,纯虚函数与抽象类)
- 【一天一篇CPP】多态性和虚函数和虚析构函数和纯虚函数和抽象类