C ++ type compatibility principle of inheritance

//子类对象可以当成父类对象使用   一定注意:父类中的构造与析构不会被子类继承  所以说子类不能调用父类的构造与析构函数
#include <iostream>
using namespace std;

class Parent
{
protected:
    int m_a;
    int m_b;
public:
    Parent()
    {
	cout << "Parent构造函数" << endl;
    }
    void setab(int a, int b)
    {
	m_a = a;
	m_b = b;
    }
    void show()
    {
	cout << "m_a=" << m_a << "  " << "m_b=" << m_b << endl;
    }
    ~Parent()
    {
	cout << "Parent析构函数" << endl;
    }
};

class Child : public Parent
{
private:
    int m_c;
public:
    Child()
    {
	cout << "Child构造函数" << endl;
    }
    void setc(int c)
    {
	m_c = c;
    }
    void print()
    {
	cout << "m_c=" << m_c << endl;
    }
    ~Child()
    {
	cout << "Child析构函数" << endl;
    }
};

int main()
{
    /*模块一:子类对象可当成父类对象使用*/
    /*Child c;		//检验 子类对象能否当成父类对象使用    结果可以
    c.setc(3);
    c.setab(1,2);
    c.show();
    c.print();*/

    /*模块二:父类指针指向子类对象*/
    /*Child c;
    c.setc(3);
    c.setab(1,2);
    Child *pc = &c;	//子类指针指向子类对象	
    pc->show();
    pc->print();

    Parent *p = &c;	//父类指针指向子类对象
    p->setab(3,4);
    p->show();
    //p->setc(5);	//经检验 父类指针确实可以指向子类对象  但父类指针是Parent类型 它只能作用Parent成员对象和函数对子类的其他成员变量和函数不起作用
    //p->print();*/

    /*模块三:基类的引用可直接引用派生类对象*/
    /*Child c;
    c.setc(6);
    c.setab(7,8);
    Parent &p = c;

    p.show();	    //父类引用只能引用父类  子类不可以  (另外:引用是常指针  情况和模块二一样)
    //p.print();*/

    /*模块四:子类对象可以直接初始化基类对象*/
    /*Child c;
    c.setc(10);
    c.setab(11,12);

    Parent p = c;   //c是子类对象,用子类对象直接对父类对象p进行初始化,这里会调用p的拷贝构造函数:Parent(const Parent &obj) 拷贝构造函数形参是基类的引用  这就回到模块三 基类的引用可以直接引用派生类的对象
    p.show();
    //p.print();*/

    /*模块五:子类对象可直接赋值给父类对象*/
    Child c;
    c.setc(13);
    c.setab(14,15);

    Parent p;
    p = c;	//c是派生类对象,用派生类对象直接赋值给基类对象p,赋值操作不会调用对象的构造函数,但是会调用对象赋值运算符重载函数 Parent operator=(const Parent &obj)  赋值运算符重载函数的参数也是一个基类的引用
    p.show();
    //p.print();


    return 0;
}

Complete code attached, five modules listed in the main function for reference

Guess you like

Origin blog.csdn.net/qq_41915323/article/details/93742222