由华为面试而想到的一个知识点---virtual虚函数
由华为面试而想到的一个知识点---virtual虚函数下面是根据华为面试题目中的一个知识,自己些的程序测试
#include<iostream>
using namespace std;
class a
{
public:
//virtual void print()
void print()
{
cout <<1<<endl;
}
};
class b:public a
{
public:
virtual void print()
{
cout <<2<<endl;
}
};
class c:public b
{
public:
void print()
{
cout <<3<<endl;
}
};
int main()
{
a *pa;
//pa=new b;
//pa->print();
pa=new c;
pa->print();
//b *pb;
//pb=new c;
//pb->print();
return 0;
}
总结:
C++里面是用虚函数来实现多态的。
在基类用virtual声明的成员函数即为虚函数。
在派生类中定义此函数,要求函数名,函数类型,函数参数个数和类型全部与积累相同,并根据派生类的需要重新定义函数体,当一个成员函数声明为虚函数后,其派生类中的同名函数都自动成为虚函数,无论是否加virtual关键字。
用基类的指针或者引用指向派生类对象,通过基类的指针或者引用调用虚函数,实际执行的将是派生类对象中定义的虚函数。
虚析构函数
如果有一个基类的指针指向派生类对象,并且想通过该指针delete派生类对象,系统只会执行基类的析构函数,而不会执行派生类的析构函数,为避免这种情况的发生,往往把析构函数声明为虚的,此时,系统将先执行派生类对象的析构函数,然后再执行基类的析构函数。
如果基类的析构函数声明魏虚的,派生类的析构函数也将自动成为虚析构函数,无论派生类析构函数声明中是否加virtual。
纯虚函数和抽象类
纯虚函数具有如下的一般形式
virtual 返回类型 函数名(参数列表)==0;
纯虚函数没有函数体,即只有函数的声明而没有函数的定义。
通常在基类中声明纯虚函数,在派生类中定义该虚函数,如果派生类中也没有定义该虚函数,则该函数在派生类中仍为虚函数
不能实例化对象的类从未抽象类,具有纯虚函数的类是不能实例化对象的,所以具有纯虚函数的类是一种抽象类。
虽然抽象类不能实例化对象,都是可以用抽象类的指针指向派生类对象,并调用派生类的虚函数的实际实现。
还有一个程序
#include<iostream>
using namespace std;
class CBase
{
public:
virtual void fun1()
{
cout<<1<<endl;
}
void fun2()
{
cout<<2<<endl;
}
};
class CDerived:public CBase
{
public:
void fun1()
{
cout<<3<<endl;
}
void fun2()
{
cout<<4<<endl;
}
};
void main()
{
CBase b;
CDerived d;
b=d;
b.fun1(); //3 //1
b.fun2(); //4 //2
CBase *pb=&b;
pb->fun1(); //1
pb->fun2(); //2
cout <<endl;
pb=&d;
pb->fun1(); //3
pb->fun2(); //2
CDerived *pd=(CDerived *)&b;
pd->fun1(); //1
pd->fun2(); //4
cout<<endl;
pd=&d;
pd->fun1(); //3
pd->fun2(); //4
CBase &b1=b;
b1.fun1(); //1
b1.fun2(); //2
cout<<endl;
b1=d;
b1.fun1(); //3 //1
b1.fun2(); //2
CBase &b2=d;
b2.fun1(); //3
b2.fun2(); //2
}
页:
[1]