c++虚函数与多态实例分析

 1 #include   <iostream>
 2 #include   <complex>
 3 using namespace   std;
 4
 5 class Base
 6 {
 7 public:
 8     Base() {cout<<"Base-ctor"<<endl;}
 9     ~Base() {cout<<"Base-dtor"<<endl;}
10     virtual void f(int){cout<<"Base::f(int)"<<endl;}
11     virtual void f(double){cout<<"Base::f(double)"<<endl;}
12     virtual void g(int i=10){cout<<"Base::g()"<<i<<endl;}
13 };
14 class Derived : public Base
15 {
16 public:
17     Derived() {cout<<"Derived-ctor" <<endl;}
18     ~Derived(){cout<<"Derived-dtor"<<endl;}
19     void f(complex<double>) {
20         cout<<"Derived::f(complex)"<<endl;
21     }
22     void g(int   i=20){
23         cout<<"Derived::g()"<<i<<endl;
24     }
25 };
26 int main()
27 {
28     cout<<sizeof(Base)<<endl;   //sizeof针对实例,不包含成员函数,每个实例都有虚函数表,子类共用父类的虚函数表所以sizeof大小一样
29     cout<<sizeof(Derived)<<endl;   //至于为什么一个虚函数(注释掉两个)和三个虚函数的大小都是一样的,这是因为无论多少个虚函数,都保存在一个虚函数表中,而对象中只保存一个指向虚函数表的虚函数表指针,所以无论多少个虚函数,大小均为一个虚函数指针
30
31     Base b;
32     Derived d;
33     Base *pb=new Derived;   //父类指针指向子类对象,多态的必要条件
34     b.f(1.0);
35     d.f(1.0);
36     pb->f(1.0);  //并非多态,函数参数不同,为新的函数。
37     b.g();
38     d.g();
39     pb->g();  //多态,动态绑定,调用的为实际传给指针的类的方法
40     delete   pb;
41     return 0;
42 }  
 1 #include   <iostream>
 2 using   namespace   std;
 3 class   Base
 4 {
 5 public:
 6     Base():data(count)
 7     {
 8         cout<<"Base-ctor"<<endl;
 9         ++count;
10     }
11     ~Base()
12     {
13         cout<<"Base-dtor"<<endl;
14         --count;
15     }
16     static int count;
17     int data;
18 };
19 int Base::count;
20 class Derived  : public Base
21 {
22 public:
23     Derived():data(count),data1(data)
24     {
25         cout<<"Derived-ctor"<<endl;
26         ++count;
27     }
28     ~Derived()
29     {
30         cout<<"Derived-dtor"<<endl;
31         --count;
32     }
33     static int count;
34     int data1;
35     int data;
36 };
37 int Derived::count=10;
38 int main()
39 {
40     cout<<sizeof(Base)<<endl;
41     cout<<sizeof(Derived)<<endl;
42
43     Base* pb = new Derived[3];
44     cout<<pb[0].data<<endl;
45     cout<<pb[1].data<<endl;
46     cout<<pb[2].data<<endl;   //为什么它是10 不懂...
47     cout<<((static_cast<Derived*>(pb))+2)->data1<<endl;
48     delete[] pb;  //由于析构函数不是虚函数,所以delete只执行了基类的析构函数,无法执行子类的析构函数 所以子类的count为13
49
50     cout<<Base::count<<endl;
51     cout<<Derived::count<<endl;
52     return 0;
53 } 

参考资料:http://blog.csdn.net/hackbuteer1/article/details/7883531

时间: 2024-12-14 18:52:42

c++虚函数与多态实例分析的相关文章

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

C++ Primer 学习笔记33_面向对象编程(4)--虚函数与多态(一):多态、派生类重定义、虚函数的访问、 . 和-&gt;的区别、虚析构函数、object slicing与虚函数

C++ Primer学习笔记33_面向对象编程(4)--虚函数与多态(一):多态.派生类重定义.虚函数的访问. . 和->的区别.虚析构函数.object slicing与虚函数 一.多态 多态可以简单地概括为"一个接口,多种方法",前面讲过的重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法). 更通俗的说,多态行是指同一个操作作用于不同的对象就会产生不同的响应.或者说,多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态行分

C++中虚函数和多态

1.C++中的虚函数 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Ta

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

你好,C++(37)上车的人请买票!6.3.3 用虚函数实现多态

6.3.3  用虚函数实现多态 在理解了面向对象的继承机制之后,我们知道了在大多数情况下派生类是基类的“一种”,就像“学生”是“人”类中的一种一样.既然“学生”是“人”的一种,那么在使用“人”这个概念的时候,这个“人”可以指的是“学生”,而“学生”也可以应用在“人”的场合.比如可以问“教室里有多少人”,实际上问的是“教室里有多少学生”.这种用基类指代派生类的关系反映到C++中,就是基类指针可以指向派生类的对象,而派生类的对象也可以当成基类对象使用.这样的解释对大家来说是不是很抽象呢?没关系,可以

c++ 内存分配 虚函数实现多态等

看到了很好的解释,先mark下,有空整理. 虚函数实现多态与多重继承乌索普的回答 很有收获,毕竟我觉得多态才是面向对象的灵魂. 这样的设计也让人得以理解为什么虚函数会像成员变量一样与对象绑定. C++成员函数在内存中的存储方式 原文地址:https://www.cnblogs.com/zsl96/p/8732662.html

&lt;C++&gt; 类(3):初始化列表 常函数和常量对象 虚函数与多态(包括纯虚函数)

一.初始化列表(初始化列表中必须有的两个内容) 1.类中const的成员变量: ①特点:不能修改 必须初始化 在构造函数后面加冒号 格式为:":变量名(值)" 也就是说 常量必须在初始化列表中初始化 ②执行顺序:构造函数先执行初始化列表 然后执行函数中的内容 1 #include<iostream> 2 using namespace std; 3 4 class CPerson 5 { 6 public: 7 const int a; 8 public: 9 CPerso

一道理解虚函数(多态)机制的题目

一道理解虚函数(多态)机制的题目(摘抄) 以下程序输出为 class Base { public: Base(int j): i(j) {} virtual~Base() {} void func1() { i *= 10; func2(); } int getValue() { return i; } protected: virtual void func2() { i++; } protected: int i; }; class Child: public Base { public:

虚函数和多态

虚函数和多态 - 虚函数 在类的定义中,前面有virtual类关键字的成员函数就是虚函数 class base{ virtual int get(); }; int base::get(){} virtual关键字只用在类定义里的函数声明,写函数体时不用 构造函数和静态成员函数不能是虚函数 虚函数可以参与多态,普通函数不能 - 多态的表现形式一 派生类的指针可以赋给基类指针 通过基类指针指向一个基类和派生类中的同名虚函数时 若该指针指向一个基类对象,那么被调用的是基类的虚函数 若该指针指向一个派