//子类对象可以当成父类对象使用 一定注意:父类中的构造与析构不会被子类继承 所以说子类不能调用父类的构造与析构函数
#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;
}
完整代码附上,在主函数中列举了五个模块 以供参考