C++虚拟函数

为了方便使用多态特性,常常需要在基类中定义虚拟函数。

在很多情况下,积累本身生成对象是不合理的。例如,动物作为一个基类可以派生出猫、狗、猴子、熊、牛等子类,但动物本身生成对象明显不合常理。

为了解决上述问题,引入了纯虚函数的概念,江汉数定义为纯虚函数,编译器要求在派生类中必须予以重载以实现多态性。

同时,含有纯虚函数的类为抽象类,他不能生成对象。

纯虚函数的定义格式:

virtual 类型 函数名=0;

测试代码如下:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class A{
 6 public:
 7     A();
 8     void f1();
 9     virtual void f2();
10     virtual void f3()=0;
11     virtual ~A();
12 };
13
14 A::A(){
15     cout<<"construct class A"<<endl;
16 }
17
18 void A::f1(){
19     cout<<"A : f1()"<<endl;
20 }
21
22 void A::f2(){
23     cout<<"A : f2()"<<endl;
24 }
25
26 A::~A(){
27     cout<<"A : ~A()"<<endl;
28 }
29
30 class B:public A{
31 public:
32     B();
33     void f1();
34     void f2();
35     void f3();
36     virtual ~B();
37 };
38
39 B::B(){
40     cout<<"construct class B"<<endl;
41 }
42
43 void B::f1(){
44     cout<<"B : f1()"<<endl;
45 }
46
47 void B::f2(){
48     cout<<"B : f2()"<<endl;
49 }
50
51 void B::f3(){
52     cout<<"B : f3()"<<endl;
53 }
54
55 B::~B(){
56     cout<<"B : ~B()"<<endl;
57 }
58
59 int main()
60 {
61     cout<<"initialize the A pointer to the B object."<<endl;
62     A *m_j = new B();
63     m_j -> f1();
64     m_j -> f2();
65     m_j -> f3();
66     delete m_j;
67
68     cout<<"initialize the B pointer to the B object."<<endl;
69     B *pB = new B();
70     pB -> f1();
71     pB -> f2();
72     pB -> f3();
73     delete pB;
74     return 0;
75 }

测试结果:

时间: 2024-08-18 00:45:58

C++虚拟函数的相关文章

C++ 实用泛型编程之 虚拟函数(C++ virtual function)杂谈

一 C++虚拟函数(C++ virtual function)杂谈 我们在编程的时候,经常会遇到这样的情况,假设有两个对象,你要在函数中分别调用它们的OnDraw方法,我们以前的做法一般是这样的. void f(int iType) { switch(iType) { case 1: //CCircle OnDraw break; case 2: //CRectangle OnDraw break; } } 这种方法当然能解决我们的问题,但是如果有新的类型要增加,它就必须要往下加代码才行了,这样

More Effective C++----(24)理解虚拟函数、多继承、虚继承和RTTI所需的代价

Item M24:理解虚拟函数.多继承.虚继承和RTTI所需的代价 C++编译器们必须实现语言的每一个特性.这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性.在多数情况下,你不用关心这些事情.然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些特性有一个基本的了解,知道编译器可能在背后做了些什么,就显得很重要.这种特性中最重要的例子是虚拟函数. 当调用一个虚拟函数时,被执行的代码必须与调用函数的对象的动态类型相一致:指向对象的指针或引用的类型

学习笔记之深入浅出MFC 第8章 C++重要性质----虚拟函数与多态(Polymorphism)

1.虚拟函数的由来 上面我们曾经提过一个例子: CShape shapes[5]; . . . //令5个shapes各为矩形.正方形.椭圆形.圆形.三角形 for ( int i = 0;  i<5;  i++) { shapes[i].display(); } 在上一节中我们说这种一般化的操作无法完成.你还记得为什么吗?是这样的,上面一节中讲到,由于每一个子类图形的绘制不同,所以display()各不相同,所以无法提升到基类中去.那么用基类定义的shapes[]数组,当然也就没有displa

C++里的继承和多态(下)——单继承、多继承、菱形继承(含虚拟函数的继承)

1.带有虚函数的类 class Base { public:                  virtual void FunTest1()                 {                                 cout << "Base::FunTest1()" << endl;                 }                  virtual void FunTest2()                 

纯虚拟函数的存在 &amp; 虚拟规格的存在, 及其中 const 的存在

考察以下代码: class AbstractBase { public: virtual IBase() = 0; virtual Interface() const = 0; virtual const char* Member() const {return _member;} protected: char *_member; } 这段代码有个问题, 虽说这个类是个抽象的, 但它仍然需要一个构造函数来初始化 _member. 可能有人觉得, 这个 AbstractBase 的设计者试图让每

含有虚函数菱形的虚拟继承(没有对虚函数进行重写)

在VS2013编程,调试 问题 :  菱形继承会引来,二义性 1.源代码 </pre><pre name="code" class="cpp">#include <iostream> using namespace std; class Base { public: virtual void FunTest() { cout << "Base::FunTest () " << endl;

MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4. PreTranslateMessage 5. WindowProc 6. OnCommand 7. OnNotify 8. OnChildNotify 9. DefWindowProc 10. DestroyWindow 11. PostNcDestroy CWnd作为MFC中最基本的与窗口打交

C++:抽象基类和纯虚函数的理解

转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义: 称带有纯虚函数的类为抽象类. ⑵抽象类的作用: 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作.所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些

关于虚函数的那些事儿

一.虚函数定义 在某基类中声明为virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为: virtual 函数返回类型 函数名(参数表) {函数体}; 虚函数是C++语言实现运行时多态的唯一手段,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数. 举个例子: class A{ public:virtual void p() { cout << "A" << endl; } }; class B : public A { public: