在线网站推广工具,网站建设域名申请,正版搜索引擎优化,wordpress 快速安装失败默认情形下#xff0c;成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行#xff0c;需要在成员函数的声明前加上关键字virtual#xff1a;
//LibMat声明表示#xff0c;其析构函数和print()函数皆为虚函数
class LibMat{
public:LibMat(){c…默认情形下成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行需要在成员函数的声明前加上关键字virtual
//LibMat声明表示其析构函数和print()函数皆为虚函数
class LibMat{
public:LibMat(){coutLibMat::LibMat() default constructor!\m;}virtual ~LibMat(){coutLibMat::~LibMat() destructor!\n;}virtual void print()const{coutLibMat::print()--I am a LibMat object!\n;}
};虚函数的作用 用基类的指针指向不同的派生类的对象时基类指针调用其虚成员函数会调用真正指向对象的成员函数而不是基类中定义的成员函数若不是虚函数则只会调用基类中定义的那个函数。
void print(const LibMat mat)
{coutin global print():about to print mat.print()\n;//下一行会依据mat实际指向的对象//解析该执行哪一个print()成员函数mat.print();
}//main函数中重复调用print()
//并依次将三个对象作为参数传递给它
//每次执行
int main()
{cout\nCreating a LibMat object to print()\n;LibMat libmat;print(libmat);cout\nCreating a Book object to print()\n;Book b(The Castle,Franz Kafka);print(b);cout\nCreating an AudiBook object to print()\n;AudioBook ab(Man without Qualities,Robert Musil,Kenneth Meyer);print(ab);
}class Book : public LibMat { //定义派生类Book继承自LibMat
public:Book( const string title, const string author ): _title( title ), _author( author ){cout Book::Book( _title , _author ) constructor\n;}~Book(){cout Book::~Book() destructor!\n;}virtual void print() const {cout Book::print() -- I am a Book object!\n My title is: _title \n My author is: _author endl;}const string title() const { return _title; }const string author() const { return _author; }protected:string _title;string _author;
};被声明为protected的所有成员都可以被派生类直接访问除了派生类之外都不得直接访问protected成员。
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;}virtual void print() const {cout AudioBook::print() -- I am a AudioBook object!\n My title is: _title \n My author is: _author \n My narrator is: _narrator endl;}const string narrator() const { return _narrator; }protected:string _narrator;
};派生类的构造函数作用后顺序 基类的构造函数、派生类的析构函数、基类的析构函数。
总结
示例中分别实现了三种类LibMatBookAudioBook
三者的成员函数有重合之处其中print()这一成员函数的具体实现各有不同使用virtual关键字以调用真正指向的对象的成员函数虚拟调用使用:号和public实现派生类继承的标记不必刻意区分“继承而来的成员”和“自身定义的成员在其使用上无特别的不同之处被声明为protected的所有成员都可以被派生类直接访问 除了派生类之外都不得直接访问protected成员。当程序定义出一个派生对象基类和派生类的构造函数都会被执行 当派生对象被销毁时基类和派生类的析构函数也都会被执行且执行顺序颠倒。