由华为面试而想到的一个知识点---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
}
分享到:
相关推荐
- C++ 实现虚函数调用时,通常会为每个含有虚函数的类创建一个虚函数表。 - 每个对象都有一个指向虚函数表的指针。 - 当通过指针或引用调用虚函数时,实际上是通过查找虚函数表来定位到正确的函数地址。 **总结...
### 华为、微软C语言面试题集知识点详解 #### 题目1:C语言基础知识及面试题 ##### 静态关键字`static`用途 1. **限制变量的作用域**:当在一个函数内部定义了一个`static`变量时,该变量只在本函数内可见,但其...
根据给定文件的信息,我们可以提炼出以下IT领域的关键...以上知识点涵盖了网络通信的基础模型、协议、编程语言基础以及处理器架构等多个方面,对于准备IT领域面试尤其是华为面试的候选人来说是非常有价值的复习资料。
- 虚函数允许子类重写父类的方法,实现运行时多态性,通过在函数声明前添加`virtual`关键字声明为虚函数。 7. **全局变量和局部变量**: - 全局变量在整个程序范围内有效,生存期与程序相同,存储在全局数据区。 ...
以上内容涵盖了华为公司的测试面试笔试题中的主要知识点,包括网络模型、IP协议、硬件设备原理、编程基础、测试用例设计等多个方面。这些知识点不仅适用于华为的测试岗位,也是IT行业中广泛的基础知识。
- 虚函数:使用`virtual`关键字声明,实现多态性,允许子类重写父类的方法。 6. **变量的作用域与存储**: - 全局变量在整个程序中可见,存储在静态存储区。 - 局部变量仅在定义它的函数或块内可见,存储在栈上...
如果一个函数在基类中声明为虚函数,那么在派生类中重写这个函数时,可以通过基类指针或引用来调用派生类的版本,实现动态绑定。 这些知识点是软件测试工程师必备的基础,理解并能熟练应用它们对于解决实际问题至关...
当对象被创建(即构造函数被调用)时,每个对象会有一个指向虚函数表的指针,这使得在运行时能够调用正确的函数,实现多态。 2. **文件操作**: - 文件逆序存储可以通过读取文件的最后一个字节,然后将其写入新...
【知识点详解】 1. **OSI 七层网络结构图与 TCP/IP 五层结构图**: - OSI 模型(Open Systems Interconnection)是一个概念性的通信协议框架,包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。...
以上是针对软件测试工程师面试题中涉及的网络协议、数据传输、硬件设备工作原理以及C++编程基础的知识点详解。这些知识对于理解软件开发和测试过程至关重要,特别是在涉及网络通信和系统设计的项目中。
每个具有虚函数的类都有一个虚函数表,这个表在编译期间由编译器生成。但是,对象的虚函数表指针是在运行时,即在对象构造函数被调用时初始化的。这个指针作为对象的隐藏成员,使得通过基类指针调用虚函数时能够正确...
【华为笔试大全史上最全】 ...以上就是华为笔试题中涉及的主要知识点,这些问题涵盖了编程基础、数据结构、算法优化、网络协议和操作系统等多个领域,对于准备面试或提升计算机技能都有很高的参考价值。
### C#面试题知识点解析 #### 1\. .NET与C#的区别 - **.NET**: 是一个由微软开发的软件框架,包含了多种语言和工具的支持。它提供了一个执行环境,使得开发人员能够构建和运行应用程序,而无需关心底层硬件的具体...