C++继承(2)

原创 2012年03月22日 21:23:48

小时候梦想改变世界

在我们只需要改变自己


C++继承机制中最耀眼的应用莫过于基于虚函数的多态。在java中所有成员函数默认都是虚函数,C++中考虑到效率的问题,需要用关键字virtual显式声明。

(1)简单多态

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

class Pet{
public:
	virtual void Speak(){cout<<"I don't no How to speak!"<<endl;};
};
class Cat:public Pet{
public:
	virtual void Speak(){cout<<"Miao~"<<endl;}
};
class Dog:public Pet{
public:
	virtual void Speak(){cout<<"Wang!!!"<<endl;}
};
void PlayWithPet(Pet& p){
	p.Speak();
}

int main(){
	Dog myDog;
	PlayWithPet(myDog);//输出Wang!!!
	return 0;
}

以上实现最简单的多态

废话不多说,下面深入研究多态的本质


(2-1)类的大小

#include "stdafx.h"

#define TRACE(a) a,cout<<#a"="<<a<<endl

#include<iostream>
using namespace std;

class C1{
	int i;
	void func1(){}
};
class C2{
	void func1(){}
	void func2(){}
	void func3(){}
	void func4(){}
};
class C3{
	void func1(){}
};

int main(){
	TRACE(sizeof(C1));
	TRACE(sizeof(C2));
	TRACE(sizeof(C3));
	return 0;
}
结果:



(2-2)有虚函数类的大小

#include "stdafx.h"

#define TRACE(a) a,cout<<#a"="<<a<<endl

#include<iostream>
using namespace std;

class Super{
public:
	virtual void func1(){}
};
class Sub1:public Super{
public:
	virtual void func1(){}
	virtual void func2(){}
	virtual void func3(){}
	void func4(){}
};
class Sub2:public Super{
public:
	virtual void func1(){}
	int i;
};

int main(){
	TRACE(sizeof(Super));
	TRACE(sizeof(Sub1));
	TRACE(sizeof(Sub2));
	return 0;
}

结果:


看出点眉目了吧。


由以上可以得出一个结论:如果一个类中有虚函数,不论虚函数的个数是多少,类的尺寸都要增加4。而且,即使其子类没有覆盖该虚函数,同样尺寸会增加4。可以将类Sub2中函数删掉会发现结果不变。

(3)VTable

增加的这个4是哪里来的呢?

很容易猜到是一个指针。32位系统中所有的指针大小都是4BYTE,char*、double*甚至一个结构或类的指针大小都是4。






C++学习第12篇-类的继承

1. 继承介绍 上一篇中,已介绍了复合类,复合类只是C++中创建复杂类的主要方法之一。 本篇中,介绍另外一种方法,即类的继承。 与复合类通过结合和连接其他对象进行创建新的对象;继承,通过直接获取...
  • zuheyawen
  • zuheyawen
  • 2012年03月28日 11:41
  • 10932

C++ static函数 继承问题

今天在论坛上看了些关于 C++中static函数 继承的问题,顺便弄个小程序试了试。。#include using namespace std; class   base   { public...
  • Chris_Magic
  • Chris_Magic
  • 2010年12月09日 18:43
  • 5564

c++的继承详解

一、前言 继承是c++语言一个重要的机制,该机制自动地为一个类提供来自另一个类的操作和数据结构,这使得程序员只需在新类中定义已有的类中没有的成分来建立一个新类。二、继承解释 继承是类...
  • qq_35644234
  • qq_35644234
  • 2016年10月15日 21:12
  • 1680

c++ 继承重要理解

首先,为什么c++需要继承,理解继承到底是什么意思?继承分为哪三种继承方式? 为什么需要继承? 在编写大型程序时,往往有很多的类,每个类都有自己的数据成员和函数,但有些类之间的数据成员和函数却相同,为...
  • xiaoyuxianshenging
  • xiaoyuxianshenging
  • 2017年03月03日 11:18
  • 1494

c++模版实例化继承

100 99.9 SubSub released Sub released Object released #include using namespace std;templateclass Obj...
  • xiuye2015
  • xiuye2015
  • 2016年01月24日 21:26
  • 499

【c++知识归纳】继承与多态(一)

c++是基于面向对象的编程语言,面向对象的三大特性为:封装、继承和多态。本文将我对继承与多态的理解进行了总结归纳,这部分内容对于学习c++编程语言是非常重要的,文章加入我的个人理解,希望能给大家带来帮...
  • XHfight
  • XHfight
  • 2016年08月24日 02:45
  • 1389

C++继承和包含

在面向对象中,有两个很重要的东西,继承和包含。更多的时候,我们不会去分析两种方式究竟哪种更好,能够达到自己想要的目的即可。但是存在即道理,还是要仔细分析一下。继承:Class Animal{}; Cl...
  • wangshubo1989
  • wangshubo1989
  • 2016年03月20日 21:08
  • 5867

浅析C++继承与派生

测试环境: Target: x86_64-linux-gnu gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1)  定义 要分析继承,首先...
  • qq_33724710
  • qq_33724710
  • 2016年06月11日 10:44
  • 3145

C++继承(一) 常用的继承方式

继承的一些基本知识
  • zyl_1102179268
  • zyl_1102179268
  • 2017年03月07日 23:28
  • 3031

C++中的结构到底可不可以继承?

个人看来,在C++中结构和类没有太大的区别,或者说存在如下区别:在结构中成员默认为public访问,类中为private访问方式 实际上,类与结构的惟一区别在于:在默认状态下,结构的所有成员均是公...
  • JunoLV
  • JunoLV
  • 2015年10月02日 14:47
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++继承(2)
举报原因:
原因补充:

(最多只允许输入30个字)