`
weihe6666
  • 浏览: 440210 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++ 继承

    博客分类:
  • C++
C++ 
阅读更多
C++ 继承


如何设计C++的类?子类和基类之间的关系?子类默认构造函数的初始化列表,多态性,虚构函数的应用?

//Object-Oriented
#include<iostream>
#include <string>
using namespace std;

class LibMat
{
public:
	LibMat(){cout << "LibMat::LibMat default constructor!\n";}
	virtual ~LibMat(){cout << "LibMat::~LibMat destructor!\n";}
	virtual void print ()const
	{
		cout << "LibMat::print() -- I am a  LibMat object! \n";
	}
};

class Book : public LibMat
{
public:
	Book(const string &title,const string &author):_title(title),_author(author)
	{
		cout<< "Book::Book (" << _title << "," << _author << ") constructor\n";
	}

	virtual ~Book(){cout<< "Book::~Book destructor\n";}
    void print ()const
	{
		cout << "Book::print() -- I am a  Book object! \n";
		cout << "My title is : " << _title << endl;
		cout << "My author is : "<< _author << endl;
	}

	const string & title(){return _title;}
	const string &author(){return _author;}

	protected:
	string _title;
	string _author;
};

class AudioBook : public Book
{
public:
	AudioBook(const string &title,const string &author,const string &narrator):Book(title,author),_narrator(narrator)
	{
		cout<< "AudioBook::AudioBook (" << _title << "," << _author << "," << _narrator << ") constructor\n";
	}

	~AudioBook(){cout<< "AudioBook::~AudioBook destructor\n";}
	void print ()const
	{
		cout << "AudioBook::print() -- I am a  AudioBook object! \n";
		cout << "My title is : " << _title << endl;
		cout << "My author is : "<< _author << endl;
		cout << "My narrator is : "<< _narrator << endl;
	}

		 const string & narrator() const {return _narrator;}
//这里两个const,为何两个,用一个可以吗?当语句为string & narrator() const {return _narrator;}时,会提示编译错误,为何?return是const 而接收的却不是const,接收和返回的类型不匹配。
//为何要用两个const:简单的说为了防止改变私有成员的值。


private:
	string _narrator;
};


void print(const AudioBook & audiobook)
{
	cout << "in gobal print(): about to print mat.print()\n";
	audiobook.print();
}


int main()
{
    AudioBook ab("Mason and Dixon","Thomas Pynchon","Edwin Leonard");
	print(ab);

	//ab.narrator() = "hewei";
	//cout <<"\n\n";

	//print(ab);
}


上述代码的输出:
LibMat::LibMat default constructor!
Book::Book (Mason and Dixon,Thomas Pynchon) constructor
AudioBook::AudioBook (Mason and Dixon,Thomas Pynchon,Edwin Leonard) constructor

in gobal print(): about to print mat.print()
AudioBook::print() -- I am a  AudioBook object!
My title is : Mason and Dixon
My author is : Thomas Pynchon
My narrator is : Edwin Leonard
AudioBook::~AudioBook destructor
Book::~Book destructor
LibMat::~LibMat destructor!

构造函数的调用顺序:在使用AudioBook的时候,会最先初始化基类的基类LibMat,调用它的构造函数,然后再初始化基类Book,最后在调用AudioBook的构造函数。

析构函数的调用顺序:和构造函数的调用顺序是相反的。

构造函数初始化列表:首先初始化最底层的基类,依次初始化。

多态性:子类为了实现自己独特的功能而屏蔽掉基类的功能,用virtual作为关键词修饰,类的每一个对象都与一个虚函数列表,程序在编译阶段并不会指定要调用哪个函数,只有在运行时通过查找各个虚函数类表,找出对应的函数。
  比如上面的代码,AudioBook的函数print,当程序调用print时,会先查找ab对象的函数列表,发现Book 和 LibMat的print函数均是虚函数,则会调用ab自己的print函数。
分享到:
评论

相关推荐

    C++继承与多态性实验报告

    ### C++继承与多态性实验报告知识点解析 #### 实验背景及目的 本实验旨在通过实际操作加深学生对C++面向对象编程的理解,特别是针对继承与多态性的概念进行深入学习。实验要求学生能够利用C++语言特性,设计并实现...

    c++继承的视频

    C++继承是面向对象编程(OOP)中的一个核心概念,它允许一个类(子类或派生类)从另一个类(基类或父类)继承特性,从而实现代码的重用和扩展。在Qt框架中,C++的继承机制同样被广泛应用,以构建丰富的用户界面和...

    C++继承与派生机制详解

    ### C++继承与派生机制详解 #### 一、引言 C++ 是一种支持面向对象编程的语言,其中继承机制是其重要的特性之一。通过继承,可以创建一个新类(称为派生类或子类),它继承了现有类(称为基类或父类)的所有属性和...

    C++继承与派生课件

    《C++继承与派生课件》 C++作为一门强大的面向对象编程语言,其核心概念之一就是继承与派生。这两个概念是实现代码复用和构建复杂对象模型的关键技术。继承允许创建一个新的类(派生类),它不仅包含原有类(基类)...

    c++继承分类

    C++继承是面向对象编程(OOP)中的一个核心概念,它允许我们创建新的类,这些新类可以扩展已存在的类的功能。在这个“c++继承分类”主题中,我们将深入探讨C++中的继承机制,以及如何在Qt环境中利用这一特性进行开发...

    08_31_C++ 继承的二义性

    08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08_31_C++ 继承的二义性08...

    c++继承中的三种访问权限.pdf

    c++继承中的三种访问权限 pdf,一个简单总结,方便查阅。

    c++继承与派生习题答案

    c++继承与派生习题答案 c++继承是面向对象编程(OOP)的一个基本概念,它允许一个类继承另一个类的成员变量和成员函数,从而实现代码的重用和继承。以下是c++继承与派生习题的答案: 1.概念填空题 1.1 三种派生...

    c++继承与派生

    C++继承与派生 本节课程主要介绍C++中继承与派生的概念和使用方法,包括公有继承、私有继承和保护继承等不同的继承方式。通过实验和实践,掌握继承与派生的基本概念和使用方法。 继承的概念 继承是面向对象编程中...

    C++继承与派生类实验报告

    C++继承与派生类是面向对象编程的重要概念,它们允许我们创建新的类,这些类可以从现有的类(称为基类或父类)继承属性和行为。在这个实验中,我们将深入理解这两个概念,并通过实际编程练习来巩固它们。 一、继承...

    c++继承描述

    c++继承描述

    C++继承

    C++继承

    C++继承共4页.pdf.zip

    C++继承是面向对象编程中的一个核心概念,它允许我们创建新的类,这些新类可以从已存在的类(称为基类或父类)中继承特性。继承的主要目的是代码重用和扩展,使得软件设计更加模块化,易于维护和升级。在这个"**C++...

    C++继承和派生实例

    入门基础实例 有关继承和派生的应用小程序 希望对大家有帮助

    c++继承与派生的相关资料

    C++的继承与派生是面向对象编程的重要概念,允许类之间的层次结构和代码复用。通过公有、私有和保护继承,可以控制成员的访问权限。派生类继承基类的特性,并可以添加新的成员和功能,同时需要处理构造函数和析构...

    C++继承与多态示例

    利用C++中的继承与多态,实验构造函数的作用

    c++继承中的内存布局

    当我们谈论“C++继承中的内存布局”时,主要关注的是类对象在内存中的组织方式,以及这如何受到继承的影响。C++的对象模型在不同环境下可能有所不同,但这里我们将基于VC++的实现进行讨论。 首先,我们要明确,C++...

    C++继承与多态性

    学习C++类的继承与多态详细全面易于理解的资料,从百度文库免费资源中获取。

    C++继承讲解和代码示例.rar

    标题"**C++继承讲解和代码示例.rar**"表明这是一个关于C++继承的教程资源,包含文字解释和实际的代码示例,用于帮助学习者理解和掌握C++中的继承机制。 首先,我们需要了解继承的基本概念。在C++中,通过使用关键字...

    C++实验五 继承与派生的应用 课程 实验报告

    总之,这个实验旨在通过实际操作加深对C++继承和派生的理解,特别是它们在构建类层次结构中的应用,以及如何处理与之相关的访问控制、构造/析构、二义性等问题。通过完成实验,学生能够更好地运用面向对象编程原则来...

Global site tag (gtag.js) - Google Analytics