`
jimmee
  • 浏览: 535958 次
  • 性别: 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);
}

 

分享到:
评论

相关推荐

    程序员8年对于c++ 面向对象的理解

    【C++面向对象的理解】 C++是一门强大的编程语言,尤其以其面向对象特性著称。面向对象编程(Object-Oriented Programming, OOP)是一种设计理念,它基于对象、类、继承、封装、多态等核心概念。8年的编程经验使得...

    面向对象程序设计c++课后答案

    根据给定文件的信息,我们可以总结出以下相关的C++知识点: ### 面向对象程序设计C++课后答案概述 ...这些知识点涵盖了从C++的基本语法到面向对象编程的核心概念,为学习者提供了全面的理解和应用C++的基础。

    殷人昆数据结构用面向对象方法与C++语言描述第二版扫描版

    《殷人昆数据结构用面向对象方法与C++语言描述》是数据结构领域一本重要的教材,尤其对于学习C++编程的计算机科学和技术专业的学生来说,它提供了深入理解数据结构和算法的基础。本书的第二版在第一版的基础上进行了...

    面向对象技术与C++编程

    C++是一种支持面向对象编程(OOP)的强类型、编译型、通用编程语言,由Bjarne Stroustrup在C语言的基础上发展而来,既具有过程性编程的特点,又引入了面向对象的特性。 标题"面向对象技术与C++编程"表明这组课件...

    面向对象编程:C++与Java比较教程 英文版

    本书《面向对象编程:C++与Java比较教程》详细比较和对比了当今最流行的两种编程语言C++和Java,旨在教授互联网时代至关重要的技能和面向对象编程技术。作者Avinash C. Kak凭借其成功教授的课程,撰写了一本全面的...

    Java面向对象编程:从C++到Java—理解面向对象

    总之,从C++转向Java的过程中,理解面向对象编程的概念以及Java与C/C++之间的主要差异至关重要。通过学习Java的运行机制、面向对象的核心特性、文件结构与命名空间管理以及异常处理等知识,开发者可以更好地适应Java...

    (麻省理工免费课程)C语言内存管理和C++面向对象编程

    《麻省理工免费课程:C语言内存管理和C++面向对象编程》是一门非常有价值的课程,旨在帮助程序员深入理解C语言和C++的核心概念和技术。通过学习这门课程,学生不仅能够掌握有效的内存管理技巧,还能了解这两种语言的...

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

    C、C++和Java是三种支持面向对象编程的编程语言,尽管它们在实现OOP的理念上有所不同。 首先,让我们来看看C++。C++是在C语言的基础上添加了面向对象的特性。C++的类(Class)是实现面向对象的核心,它定义了一组...

    面向对象编程C++和Java比较教程 中英文完整版 pdf

    本教程对比了两种广泛应用的面向对象语言——C++和Java,帮助读者深入理解两者之间的异同。 C++是Bjarne Stroustrup于1983年创建的,它是C语言的扩展,增加了类、模板、异常处理等面向对象特性。C++强调性能和灵活...

    李爱华、程磊_面向对象程序设计第二章案例源程序

    本资源集合是"李爱华"和"程磊"编写的《面向对象程序设计》一书第二章的C++语言基础案例源程序,涵盖了C++的基本要素,旨在帮助学习者通过实践理解C++的基础知识。 在第二章中,主要讨论了C++语言的基础,包括以下几...

    c语言面向对象设计

    《C语言面向对象设计》这本书会详细讲解如何在C语言中实现这些概念,并通过实例帮助读者理解和应用。通过学习这本书,开发者能够了解如何在C语言环境中利用面向对象设计来提高代码的可读性、可维护性和可扩展性。这...

    C++面向对象实验代码实验2

    这个实验代码`test2`提供了一个实践C++面向对象编程的平台,通过分析和运行这些代码,你可以更好地理解面向对象编程的各个方面,并提升自己的编程技巧。在学习过程中,一定要动手尝试修改和扩展代码,这样能更深刻地...

    面向对象程序设计与c++语言 朱战立

    本书《面向对象程序设计与C++语言》由朱战立编写,旨在帮助读者深入理解面向对象编程思想以及如何在C++中实现这些思想。书中可能涵盖了以下几个方面的内容: 1. **面向对象基础**:讲解对象、类、封装、继承、多态...

    面向对象编程C++和Java比较教程

    面向对象编程(Object-...总之,C++和Java虽然都是面向对象的语言,但在实现细节和应用领域上有所区别。理解和掌握这两种语言的不同特性,将有助于程序员根据项目需求选择合适的工具,并在不同语言之间无缝切换。

    面向对象程序设计与C++语言

    C++语言是实现面向对象编程的主要工具之一,由Bjarne Stroustrup于1983年在C语言的基础上扩展而来,旨在提供更高级别的抽象和模块化能力。 在学习面向对象编程时,首先要理解的是类(Class)和对象(Object)。类是...

    面向对象程序设计C++ (4).pdf

    面向对象程序设计是C++的核心特性之一,它允许我们通过类和对象来组织和管理代码。在C++中,类定义了一组相关的数据和操作这些数据的方法,而对象则是类的实例,具有类所定义的属性和行为。 1. `break` 和 `...

    C++面向对象与Visual C++程序设计案例教程

    《C++面向对象与Visual C++程序设计案例教程》是一本非常实用的教材,它不仅仅局限于理论知识的介绍,更重要的是通过实际案例引导读者理解和掌握C++面向对象编程以及Visual C++程序设计的相关技术。无论是对于初学者...

    面向对象与c++复习试卷

    C++是一种支持面向对象编程的强类型、编译型语言,由Bjarne Stroustrup于1983年在C语言的基础上扩展而成。 在C++中,面向对象的核心概念包括: 1. 类(Class):类是对象的模板或蓝图,定义了一组特性和行为。它...

    C语言面向对象编程

    总之,《C语言面向对象编程》这本书为那些没有C++编译器环境的程序员提供了宝贵的资源,特别是对于那些在嵌入式系统、小型系统等领域工作的开发者来说尤其重要。通过这些技巧,可以在不使用C++的情况下实现面向对象...

    c++面向对象综合试题

    5. C++与C的关系:C++是C语言的超集,包含了C的所有语法特性,并增加了面向对象的特性。C++起初被称为“带类的C”,在1983年正式命名为C++。 6. 注释:C++中,`//`用于单行注释,`/* ... */`用于多行注释。 7. ...

Global site tag (gtag.js) - Google Analytics