C++ 5.2继承和virtual

以下用libmat、book做为测试

无virtual
析构函数此时无virtual
print此时无virtual

//libmat.h
#ifndef LIBMAT_H
#define LIBMAT_H


class LibMat
{
    
    
    public:
        LibMat();
         ~LibMat();
        void print() const;

    protected:

    private:
};


#endif // LIBMAT_H


//libmat.cpp
#include "LibMat.h"
#include <iostream>

using namespace std;

LibMat::LibMat()
{
    
    
    cout<<"LibMat::LibMat()\n";
}

LibMat::~LibMat()
{
    
    
    cout<<"LibMat::LibMat()\n";
}
void LibMat::print() const
{
    
    
    cout<<"LibMat::print() const\r\n";
}

调用

//main.cpp
#include <iostream>
#include <LibMat.h>
using namespace std;

void print(const LibMat &rhs)
{
    
    
    cout<<"main print \r\n";
    rhs.print();
}

int main()
{
    
    
    LibMat libmat;
    print(libmat);
    return 0;
}

新建一个book类,继承于libmat

//.h
class Book :public LibMat
{
    
    
public:
    Book(const string &title, const string &author);
    ~Book();
    void print() const;
    const string& title() const {
    
    return _title;}
    const string& author() const {
    
    return _author;}

protected:
    string _title;
    string _author;
};
//.cpp
Book::Book(const string &title, const string &author):_title(title),_author(author)
{
    
    
    cout<<"Book::("<<title<<","<<author<<")\r\n";
}
Book::~Book()
{
    
    
    cout<<"Book::~Book()";
}
void Book::print() const
{
    
    
    cout<<"Book print\r\n"<<
    "title is "<<_title<<"\n"<<
    "author is "<<_author<<"\n";
}

调用

int main()
{
    
    
    Book test("i love china","lin_xian_xing");
    print(test);
    return 0;
}

按照感觉上来说,这个print应该调用的时book的print,但是我会这样说,证明运行后的程序肯定不是这样
在这里插入图片描述
现在加上virtual看看

class LibMat{
    
    
		.....
		virtual ~LibMat();//virtual
        virtual void print() const;
        ......
}

在这里插入图片描述
Book的print覆盖(override)LibMat的print

猜你喜欢

转载自blog.csdn.net/weixin_43387612/article/details/107589849