C++ 继承

[size=large][b][align=center]C++ 继承[/align][/b][/size]

如何设计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函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值