`

【C++ Primer】类的多态

 
阅读更多

一,概述

1)接口的多种不同的实现方式即为多态。

2)多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中都是通过虚函数(Virtual Function) 实现的。

3)关键点:多态还有个关键之处就是一切用指向基类的指针或引用来操作对象


二,示例

1)普通的对象操作方式

#include <iostream>
using namespace std;
class A{
public:
	void print()
	{ 
		cout<<"This is A"<<endl;
	} 
};
class B:public A{
public:
	void print()
	{ 
		cout<<"This is B"<<endl;
	}
};
int main(){ //为了在以后便于区分,我这段main()代码叫做main1  
	A a; 
	B b; 
	a.print();
	b.print();
}

输出:This is A

This is B

2)按照多态的操作对象方式:通过父类对象来操作子类对象

#include <iostream>
using namespace std;
class A{
public:
	void print()
	{ 
		cout<<"This is A"<<endl;
	} 
};
class B:public A{
public:
	void print()
	{ 
		cout<<"This is B"<<endl;
	}
};
int main(){ //通过父类来操作子类 
	A a; 
	B b; 
	A* p1=&a;
	A* p2=&b;
	p1->print();
	p2->print();
}

输出:This is A

This is A

这跟我们预期的不一样


3)采用多态,就是在父类函数前面加上virtual

根据不同的类对象,调用其相应的函数,这个函数就是虚函数

#include <iostream>
using namespace std;
class A{
public:
	virtual void print()
	{ 
		cout<<"This is A"<<endl;
	} 
};
class B:public A{
public:
	void print()
	{ 
		cout<<"This is B"<<endl;
	}
};
int main(){ //通过父类来操作子类 
	A a; 
	B b; 
	A* p1=&a;
	A* p2=&b;
	p1->print();
	p2->print();
}

三,虚函数进阶

void (A::*fun)(); //定义一个函数指针   
A *p=new B;
fun=&A::fun;//是真正获得虚函数的地址吗? 其实间接获得虚函数地址的一段代码的地址

#include <iostream>
using namespace std;

class A{ 
public:
	virtual void fun()
	{ 
		cout<<"A::fun"<<endl;
	}
	virtual void fun2()
	{
		cout<<"A::fun2"<<endl;
	}
}; 
class B:public A{
public:
	void fun()
	{ 
		cout<<"B::fun"<<endl;
	}
	void fun2()
	{
		 cout<<"B::fun2"<<endl;
 	}
}; 
void CallVirtualFun(void *pThis , int  index=0)
{
	void (*funptr)(void*);
	long lVptrAddr;
	memcpy(&lVptrAddr,pThis,4);
	memcpy(&funptr,reinterpret_cast<long*>(lVptrAddr)+index,4);
	funptr(pThis); 
} 
int main()
{

	void (A::*fun)(); //定义一个函数指针   
	A *p=new B;
	fun=&A::fun;//是真正获得虚函数的地址吗? 其实间接获得虚函数地址的一段代码的地址
	(p->*fun)();//B::fun 
	fun = &A::fun2;
	(p->*fun)();//B::fun2
	 
    CallVirtualFun(p); //调用虚函数p->fun() 
	CallVirtualFun(p,1);//调用虚函数p->fun2() 
	delete p;
	system("pause");
	return 0; 
} 

四,补充重要知识

实例化类的虚函数必须有定义,原因如下:有虚函数作为成员函数的类, 它的实例化-对象, 在运行过程分配到的内存不止是它的成员数据, 还有一个指向该类虚函数表(vtable)的指针, 虚函数表中的每个数据项都是一个虚函数的入口地址;

如果一个对象的虚函数只有声明而没有实现, 就会出现这个虚函数表找不到本应作为其数据项之一的某函数的入口地址, 虚函数表在运行前不能装载完成, 所以产生连接错误!








分享到:
评论

相关推荐

    C++Primer Plus附录源码等文件.zip

    8. 继承与多态:继承允许创建新的类来扩展已有的类。多态性是通过虚函数实现的,它允许基类的指针或引用调用派生类的成员函数。练习题会涵盖这两个面向对象的关键特性。 9. 模板:模板是C++的泛型编程工具,允许...

    C++Primer 习题解答(第4版)--绝对完整版

    2. **类与对象**:C++的核心是面向对象编程,解答中会深入讲解类的定义、对象的创建与使用,以及封装、继承和多态等概念。同时,还会涉及构造函数、析构函数、拷贝构造函数和赋值运算符重载。 3. **模板与泛型编程*...

    C++ Primer 5th 英文高清版 (带完整目录)

    此外,C++ Primer 5th还详细阐述了模板这一强大的工具,包括函数模板、类模板、模板特化和模板元编程。模板是C++中的泛型编程基础,能够实现代码的高效和灵活。 标准库是C++编程的重要组成部分,书中详细介绍了STL...

    C++ primer中文版-高清-带目录

    2. **类与对象**:讲解面向对象编程的核心概念,包括类的定义、对象的创建与销毁、封装、继承和多态等。 3. **标准库**:详细介绍C++标准库中的容器(如vector、list、set、map等)、算法(如排序、查找)、迭代器...

    C++primer第四版源代码

    C++语言是Bjarne Stroustrup在1983年基于C语言设计的,它保留了C的高效性和灵活性,同时引入了面向对象编程(OOP)的概念,如类、继承、多态和模板等。在《C++ Primer》第四版中,你可以学习到以下知识点: 1. **...

    C++primer中文第五版

    在《C++ Primer 中文第五版》中,读者还可以学习到基本的面向对象编程概念,如类、对象、继承、多态,以及如何利用STL(Standard Template Library)进行高效的数据处理。STL包括容器(如vector、list、set)、迭代...

    c++ primer plus 答案 c++ primer plus 答案

    4. **类与对象**:C++的核心是面向对象编程,通过封装、继承和多态实现代码的模块化。了解类的构造函数和析构函数,以及成员函数和友元函数的概念。 5. **模板**:模板是C++的泛型编程工具,允许我们编写可以处理...

    C++ Primer第四版【中文高清扫描版】.pdf

    10. 类的定义、构造函数、复制控制、重载操作符、继承和多态等面向对象编程的核心概念。 11. 模板与泛型编程,包括函数模板、类模板和模板特化的使用。 12. 面向对象编程技术,如异常处理、命名空间、多重继承、虚...

    c++ primer有目录pdf第五版本5th

    - **继承与多态**:了解类的继承关系,虚函数和多态的概念。 3. **C++11新特性** - **智能指针**:std::unique_ptr、std::shared_ptr和std::weak_ptr的使用,以及内存管理的自动化。 - **lambda表达式**:简化...

    C++ Primer(第5版)_带书签_高清完整版

    4. **继承与多态**:继承是类之间的一种层次关系,允许子类继承父类的属性和行为。多态性则允许不同类型的对象对同一消息作出响应,这在C++中主要通过虚函数和抽象类实现。 5. **模板**:C++的泛型编程主要依赖于...

    C++ primer 4th Edition 英文版

    - **面向对象编程**:掌握类的设计原则,理解封装、继承和多态,并能运用这些概念设计和实现复杂的系统。 - **STL(Standard Template Library)**:熟悉容器(如vector、list、set、map等)、迭代器和算法,学会...

    C++ Primer 英文版pdf

    ### C++ Primer 第三版知识点概述 #### 一、书籍基本信息 - **书籍名称**:C++ Primer(第三版) - **作者**:Stanley B. Lippman 和 Josée Lajoie - **出版社**:Addison-Wesley - **出版年份**:1998年 - **页数...

    C++ primer plus 课后习题答案

    4. **面向对象编程**:类的定义、对象的创建与初始化、封装、继承、多态等概念。 5. **模板**:函数模板和类模板,以及模板元编程的基础知识。 6. **STL(Standard Template Library)**:容器(如vector、list、set...

    C++ Primer Plus 第6版 中文版课后代码习题答案

    1. **C++基础知识**:C++是面向对象的编程语言,它扩展了C语言的功能,引入了类、对象、封装、继承、多态等概念。在《C++ Primer Plus 第6版》中,读者会学习到变量、数据类型、运算符、流程控制、函数等基本元素。 ...

    C++primer第五版英文版

    书中从基础的数据类型和控制结构开始讲起,逐步深入到函数、数组和指针的高级用法,接着探讨面向对象编程的基本概念,包括类和对象、继承与多态等,最后对C++的模板编程、异常处理和标准库等高级特性进行了详细说明...

    C++ primer 5e 课后答案

    学习如何定义类,创建和使用对象,以及掌握封装、继承和多态的基本概念。 7. **模板**:模板是C++的泛型编程工具,允许创建泛化的函数和类。理解函数模板、类模板以及模板特化是进阶C++的关键。 8. **STL(标准...

    C++Primer(第4版)-课后习题答案.pdf

    《C++ Primer(第4版)》是一本深入学习C++编程语言的经典教材,其课后习题答案提供了丰富的实践练习和问题解析,帮助读者巩固并深化对C++语法、概念的理解。以下将针对各章节的主要知识点进行详细阐述: 1. 第一章...

    c++primer第五版习题答案(第18章)

    通过这种方式,学习者能够更好地掌握C++编程的核心概念和实践技巧,诸如输入输出流、文件操作、字符串处理、动态内存管理、类和对象、继承与多态等。 尤其值得注意的是,《C++ Primer》第五版中包含了C++11和C++14...

    C++Primer习题集(第5版)

    ### C++ Primer习题集(第5版) #### 书籍概述 《C++ Primer》第五版是一本权威的C++编程教程,由Stanley B. Lippman、Josée Lajoie与Barbara E. Moo共同编著。本书旨在帮助读者深入理解C++语言的核心概念及其...

Global site tag (gtag.js) - Google Analytics