`
jimmee
  • 浏览: 530623 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从c面向对象的实现理解c++的对象(二)

阅读更多

1. 类就可以看作一个struct,类的方法,可以理解为通过函数指针的方式实现的,类对象分配内存时,只分配成员变量的,函数指针并不需要分配额外的内存保存地址。

2. c++中类的构造函数,就是进行内存分配(malloc),调用构造函数

3. c++中类的析构函数,就时回收内存(free)

4. c++是基于栈和全局数据分配内存的,如果是一个方法内创建的对象,就直接在栈上分配内存了。

专门在克隆时使用的构造函数,是构造拷贝函数,原型时“类名(const 类名&)",避免拷贝整个对象,在传递对象时,改为传递指针,同时将构造拷贝函数设置为私有这样做到强制限制。

5. 成员变量为私有,仅仅时编译时起到保护左右,实际内存模型没有变。

6. 继承是在原有的父类的内存模型上,再添加自己的数据

#include <stdio.h>
#include <stdlib.h>

class TestClass {
public:
	int a;
	TestClass() {
		a = 1;
		printf("do constructor\n");
	}

	~TestClass() {
		printf("do destructor\n");
	}

	TestClass(TestClass &src) {
		a = src.a;
	}
};

void test(TestClass al) {
	printf("%d\n", al.a);
}

void test(TestClass *al) {
	printf("%d\n", al->a);
}

int main(void) {
	TestClass ac;
	printf("after constructor call\n");
	printf("=================================\n");
	test(ac);
	printf("after function call\n");
}

 

7. c++多态的实现方式:虚函数(virtual)+使用对象的指针调用:一个类的virtual函数会被分配一个全局数组,保存他们的地址。所有的这个类的对象共享。

如果是自己模拟实现override,实际就是要调用的实现使用函数指针,子类确定这些函数。

/*
 * test.cpp
 *
 *  Created on: 2015年5月24日
 *      Author: jme
 */
#include <stdio.h>
#include <stdlib.h>

// 1. 定义一个函数指针
typedef void (*testFunc)();

class Base {
public:
	testFunc getHandler() {
		return func;
	}
	// 函数指针
	testFunc func;
};

void funcImpl_1() {
	printf("funcImpl_1\n");
}

void funcImpl_2() {
	printf("funcImpl_2\n");
}


class Sub1: public Base {
public:
	Sub1(){
		// 2. 子类设置函数指针值
		func = funcImpl_1;
	}
};

class Sub2: public Base {
public:
	Sub2() {
		this->func = funcImpl_2;
	}
};

int main(void) {
	Base *baseC;
	Sub1 *upper = new Sub1();
	Sub2 *lower = new Sub2();
	baseC = upper;
	baseC->func();
	baseC = lower;
	baseC->func();
}

 c++的virtual语法:

/*
 * test.cpp
 *
 *  Created on: 2015年5月24日
 *      Author: jme
 */
#include <stdio.h>
#include <stdlib.h>


class Base {
public:
	// 如果是
	virtual void testFunc();
	void testFunc2();
};

class Sub1: public Base {
public:
	Sub1(){
	}

	virtual void testFunc();
	void testFunc2();
};

class Sub2: public Base {
public:
	Sub2() {
	}

	virtual void testFunc();
	void testFunc2();
};

class Sub3: public Base {
public:
	Sub3() {
	}

	void testFunc();
	void testFunc2();
};

void Base::testFunc() {
	printf("base testFunc\n");
}

void Base::testFunc2() {
	printf("base testFunc2\n");
}


void Sub1::testFunc() {
	printf("Sub1 testFunc\n");
}

void Sub1::testFunc2() {
	printf("Sub1 testFunc2\n");
}

void Sub2::testFunc() {
	printf("Sub2 testFunc\n");
}

void Sub2::testFunc2() {
	printf("Sub2 testFunc2\n");
}


void Sub3::testFunc() {
	printf("Sub3 testFunc\n");
}

void Sub3::testFunc2() {
	printf("Sub3 testFunc2\n");
}

void callWithPointer(Base *baseC) {
	// 因为定义了虚函数, 同时是指针调用,会查虚表,确定具体的实现函数
	baseC->testFunc();
}

void callWithoutPointer(Base baseC) {
	// 虽然定义了虚函数, 但是是直接对象调用懂,不会查虚表。
	baseC.testFunc();
}

void call2(Base *baseC) {
	// 静态覆盖的实现,根据具体的类型来确定调用的是父类还是子类的
	baseC->testFunc2();
}

int main(void) {
	Sub1 s1;
	Sub2 s2;
	Sub3 s3;
	callWithPointer(&s1);
	callWithPointer(&s2);
	callWithPointer(&s3);
	printf("=================\n");
	callWithoutPointer(s1);
	callWithoutPointer(s2);
	callWithoutPointer(s3);
	printf("=================\n");
	call2(&s1);
	call2(&s2);
	call2(&s3);
}

 

分享到:
评论

相关推荐

    使用C、C++、Java实现面向对象demo

    使用C、C++、Java实现面向对象demo,对面向对象的学习有较深刻的理解

    C++面向对象程序设计

    课程内容有:面向对象的基本概念和要素,包括类、对象、类的特性、消息传递等;C语言基础,包括变量、类型、数组、指针、结构、控制语句、程序结构等;C++对C的改进部分,包括注释,作用域运算符,宏定义等;类,...

    用c实现面向对象

    实现面向对象,不是C语言擅长的,用C实现面向对象,多少会显的晦涩和力不从心,不过从中,也许可以加深对C++的理解

    c语言实现面向对象思想的代码 (嵌入式实践可用)

    c语言是一个面向过程的语言,但是也可以实现c++的面向对象的思想。 这个资源可以理解多态的虚表虚指针。 在嵌入式研发中会使用面向对象的思想。 适用于c语言研发工程师。

    链表的C++实现(线性表的链式存储C++实现)

    大致实现了STL中的链表的基本功能,通过对比C语言实现线性表的链式存储可以更好的理解面向对象编程和面向过程的区别,更加深入的理解C语言和C++语言的区别。相关的文章可以在我的主页算法与数据结构专栏查看。

    C语言接口与实现

    与当前某些面向对象语言不同,C语言为创建可重用应用程 序接口(Application Programming Interface,API)提供的语言和功能支持非常少。尽管大多 数C语言程序员在自己所编写的每一个应用程序中都使用API和实现API的库...

    关于C语言和C++的详细解释.rar

    一、C语言是面向过程语言,而C++是面向对象语言 我们都知道C语言是面向过程语言,而C++是面向对象语言,说C语言和C++的区别和联系,也就是在比较面向过程和面向对象的区别。 1、面向过程和面向对象的区别 面向过程...

    通过反汇编理解 C++语言实质探讨

    然 而正是面向对象程序设计的这些特点,长期以来,那些对标准C语言有较好了解的广大技术人员一直难于顺利地过渡到面向对象的编程方法上来,主要表现于对其实 质性的技术概念缺乏真正的了解。比如对象模型的构造、...

    C++从初识到模板类-大一,面向对象编程

    这是我大一上学期刚学完C语言后,开始学习C++,开始接触面向对象编程这一概念。 在学习C++过程中,加深了我对编程的理解,比如python为什么很多方法可以对不同的数据类型进行操作,同时模板类,泛型编程帮助我可以...

    《面向对象程序设计方法学》实验指导书

    理解面向对象程序设计的基本原理,包括类、对象、抽象、封装、继承和多态性等关键要素以及其关键语法特性—类;掌握用C++编写面向对象程序的一般方法;了解VC++编程环境。通过上机实验进一步加深对课程基本内容的...

    C++ 面向对象教程 21 courses#

    1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺...

    线性表的顺序存储C++实现(类模板实现)

    大致实现了STL中的线性表基本功能,通过对比C语言实现线性表的顺序存储可以更好的理解面向对象编程和面向过程的区别,更加深入的理解C语言和C++语言的区别。相关的文章可以在我的主页算法与数据结构专栏查看。

    C++ 经典教程含源码

    C++是一种优秀的面向对象程序设计语言。它从C语言的基础上发展而来,但又比C语言...通过本章的学习,读者可以了解C++语言的产生及特点,能够基本掌握安装和配置Visual C++6.0开发环境的方法,并理解C++程序的开发过程。

    c++ 编程实现人事管理系统

    人事管理系统,c++类的集中体现,便于学习和深化对c++的理解与运用。课程设计系统。

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    *1.1 从C到C++ *1.2 最简单的C++程序 1.3 C++程序的构成和书写形式 1.4 C++程序的编写和实现 1.5 关于C++上机实践 习题 第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.2.1 什么是常量 2.2.2 ...

    C++实现图形管理.zip

    通过课程设计2加深对《C++面向对象程序设计》课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,掌握C++语言的基础知识,理解面向对象系统的封装性、继承性和多态性:熟练使用C语言中的函数、数组、...

    Visual C++ 6 参考大全

    通 过本书的学习,读者不但能快速学习和掌握Microsoft Visual C++6的重要的基础知识,而且还能学会调试程序代码,编写无语法错误的程序,理解面向过程编程与面向对象编程之间的差别,并且学会开发从简单到中高级的...

    C语言接口与实现 c语言

    而面向对象的语言,如c++,Modula-3,则鼓励将接口与实现分离,基于接口的设计独立与任何特定 的语言,但是它要求程序员对像c一样的语言有更多的驾驭能力和更高的警惕性,因为这类语言很容易破坏带有隐含实现信息的...

    JAVA面向对象基础入门笔记(对比C++)

    因为C++并不是一个有严格意义的面向对象的语言,它有过程和对象的共同特点,既可以当作C语言来实现面向过程,也可以像JAVA那样封装各种类来实现特点功能的面向对象编程。 简单介绍了一下JAVA的类,主要对有C/C++基础...

    最新中农大线上作业Java语言与面向对象程序设计A-F(1).doc

    面向对象实现 C.C++编程 D.文档收集 参考答案:B 您的答案:B 13、面向对象分析的主要目的就是开发人员在有用户参与协作下,明确用户需求,应用 标准化的面向对象模型规范地表述需求,最后形成面向对象的( )...

Global site tag (gtag.js) - Google Analytics