1.
classic::classic():cd()
{
ZYZP[0] = '\0';
}
classic::classic(const classic&c) : cd(c)
{
strcpy_s(ZYZP,50,c.ZYZP);
}
classic::classic(const char* s1, const char* s2,const char*s3,int n, double x) : cd(s2,s3,n,x)
{
strcpy_s(ZYZP, 50, s1);
}
cd为classic的基类
在进入{}之前基类要被创立好,因此使用初始化列表 cd()
派生类的默认构造函数的初始化列表为调用基类的默认构造函数。
派生的复制构造函数的初始化列表为调用基类的复制构造函数,在{}中完成派生类对象的赋值。
派生类对象通过数据成员赋值的构造函数的初始化列表为调用这些数据成员参数的基类构造函数。
若将派生类引用或指针cc指向基类对象c1,则可通过cc.来调用派生类方法,但这样会出现问题,因此派生类引用或指针不能指向基类对象,但基类引用或指针可以指向派生类对象,反之可以
派生类对象属性可能比基类对象的多,直接赋值可能出问题,所以不被允许,派生类对象不能给基类对象赋值,反之可以。
默认的基类赋值函数原型:
cd&operator=(const cd& cd);
cd c4=c2;可行是因为调用了重载的=,相当于cons cd& cd=c2,这是允许的。
默认的派生类赋值函数原型:
classic & opearator=(const classic& cs);
classic c3=c1;之所以不行是因为派生类引用不能指向基类对象。
report为虚方法,因此通过指向派生类对象的基类指针调用时调用的为指向对象(即派生类)的方法。
因为在派生类中使用了new,因此要定义显式的重载运算符。
基类也使用了new,因此也要定义显式的重载运算符;
派生类classic为公有继承,无法访问基类中的私有对象,因此基类中私有对象的赋值要交给基类的显式运算符,通过作用域来调用。
ps:使用动态内存分配即使用new,在private里定义指针,在默认构造函数中设置其为空指针(nullptr)。