您的位置:首页 > 编程语言 > C语言/C++

我的虚函数个人总结

2016-06-30 12:32 337 查看
通过将基类中的成员函数声明为虚函数,那么子类中的同原型函数构成成为基类中的虚函数的覆盖版本,此时,通过指向子类的对象的基类指针(或者引用)调用该虚函数,实际被调用函数版本的由指针(或者引用)所指向的对象决定,而于指针(引用)本身的类型无关,此语法现象叫做多态

动态类型绑定和虚函数表

A * pa=new B

当编译器看到如下的函数调用时,

pa->bar()

它不知道pa所指向的对象的确切类型,编译器就会生成一段代码替代以上的函数调用 该代码执行如下的操作

1:确定pa所指向的对象的实际类型

2: 然后通过这个对象的虚函数表 指针,vftb1访问其虚函数表

找到与foo函数相对应的虚函数入口地址

3: 根据入口地址调用该函数

class parent{
public:
parent(){
cout<<"parent contrount"<<endl;
}
virtual void hello(){}
void parent_hello_1(){
cout<<"hello parent hello_1"<<endl;
}
};
class child :public parent
{
public :
child(){
cout<<"child contrount"<<endl;
}
void hello(){
cout<<"child  child hello ....."<<endl;
}
void child_hello_1(){
cout<<"child hello _1"<<endl;
}
};
int main(int argc, const char *argv[])
{
parent * p=new child;
p->hello();
return 0;
}


运行结果:

parent contrount

child contrount

child child hello

虚析构函数

1:通过将基类的析构函数定义为虚函数 当delete一个指向子类的基类的指针时,实际上被调用的是子类的析构函数,而子类的析构函数 将会自动调用基类的 析构函数 ,进而保证类对象及其基类的对象都能够得到释放

2:即使析构函数 什么也不作,仅仅为了实现提供一个虚析构函数也需要基类定义该析构函数,因为缺省析构函数不是虚函数

3:如果一个类中包含有虚函数,那么总将其定义一个虚析构函数总没有坏处

纯虚函数,抽象类,纯抽象类 的定义和区分

1:纯虚函数 :virtual 返回类型 成员函数名 (形参表)=0;

2:包含纯虚函数 的类叫做抽象类 抽象类不能实例化对象

3:完全由纯虚函数组成的抽象类,叫做纯抽象类

不可以是虚函数的: 构造函数 静态成员函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  virtual c++