- 派生类从基类那里继承了什么?
成员(属性)、函数(方法)- 基类的公有成员成为派生类的公有成员。基类的保护成员成为派生类的保护成员。基类的私有成员被继承,但不能直接访问。
- 派生类不能从基类那里继承什么?
- 假设baseDMA::operator=()函数的返回类型为void, 而不是baseDMA&,这将有什么后果?如果返回类型为baseDMA,而不是baseDMA&,又将有什么后果?
如果返回类型是void,会报错,因为将一个baseDMA对象赋值给另一个base对象时,如果返回void型,类型是没法匹配上,就没办法赋值的。- 如果返回的类型是void,仍可以使用单个赋值,但不能使用连锁赋值:
baseDMA magazine("Pandering to Glitz",1);
baseDMA gift1, gift2, gift3l
gift1 = magazine;
gift2 = gift3 = gift1 ;
- 如果方法返回一个对象,而不是引用,则该方法的执行速度将有所减慢,这是因为返回语句需要复制对象。
如果返回类型是baseDMA,将造成返回的baseDNA类型的对象,没有办法更改。 (其实我还是觉得这个也没错)
- 创建和删除派生类对象时,构造函数和析构函数调用的顺序的怎样的?
- 先调用基类的构造函数,然后派生类的构造函数,然后派生类的析构函数,最后基类的析构函数。(析构和构造顺序是反着来的)
- 按派生的顺序调用构造函数,最早的构造函数最先调用。
- 如果派生类没有添加任何数据成员,它是否需要构造函数?
不需要吧。- 需要。每个类都必须有自己的构造函数。如果派生类没有添加新成员,则构造函数可以为空,但必须存在。
- 如果基类和派生类定义了同名的方法,当派生类对象调用该方法时,被调用的将是哪个方法?
- 是派生类的方法。(最好在基类将此方法设定为虚函数)
- 只调用派生类方法。它取代基类定义。仅当派生类没有重新定义方法或使用作用域解析运算符时,才会调用基类方法。然后,应把将所有要重新定义的函数声明为虚函数。
- 在什么情况下,派生类应定义赋值运算符?
赋值符号右边是基类或者非当前派生类- 如果派生类构造函数是用new或new[]运算符来初始化类的指针成员,则应定义一个赋值运算符。更普遍地说,如果对于派生类成员来说,默认赋值不正确,则应定义赋值运算符。
- 可以将派生类对象的地址赋给基类指针吗?可以将基类对象的地址赋给派生类的指针吗?
- 可以将派生类对象的地址赋给基类指针,此时指针指向的对象包含的只有派生类中的基类成员。
- 可以将基类对象的地址赋给派生类指针,前提是派生类新增的成员有默认值。 只有通过显式类型转换,才可以将基类对象的地址赋给派生类指针(向下转换),而且使用这样的指针不一定安全。
- 可以将派生类对象赋给基类对象吗?可以将基类对象赋给派生类对象吗 ?
不可以将派生类对象赋给基类对象。 可以将派生类对象赋给基类对象。对于派生类中新增的数据成员都不会传递给基类成员。然而,程序将使用基类的赋值运算符。可以将基类对象赋给派生类对象,前提是派生类新增的成员有默认值。 只有当派生类定义了转换运算符(即包含将积累引用作为唯一参数的构造函数)或使用基类为参数的赋值运算符时,才可以将基类赋值给派生类。
- 假设定义了一个函数,它将基类对象的引用作为参数。为什么该函数也可以将派生类对象作为参数?
- 因为派生类对象中也有基类对象的成员。
- 因为C++允许基类引用指向从该基类派生而来的任何类型。
- 假设定义了一个函数,它将基类对象作为参数(即函数按值传递基类对象)。为什么该函数也可以将派生类对象作为参数?
也许因为基类对象中比派生类新增的成员有默认值? (写的什么乱七八糟,概念都搞混了)- 按值传递将调用复制构造函数。由于形参是基类对象,因此将调用基类的复制构造函数。复制构造函数以基类引用为参数,该引用可以指向作为参数传递的派生对象。
- 最终结果是,将生成一个新的基类对象,其成员对应于派生对象的基类部分。
- 为什么通常按引用传递对象比按值传递对象效率更高?
- 按引用传递,传递的是地址。按值传递,需要每个成员的值传递一遍,慢。
- 按引用(而不是按值)传递对象,这样可以确保函数从虚函数中受益。另外,按引用(而不是按值)传递对象可以节省内存和空间,尤其对于大型对象。
- 按值传递对象的主要优点在于可以保护原始数据,但可以通过将引用作为const类型传递,来达到同样的目的。
- 假设 Corporation 是基类, PublicCorporation 是派生类。再假设这两个类都定义了head()函数,ph是指向 Corporation 类型的指针,且被赋值给了一个 PublicCorporation 对象的地址。如果基类将head()定义为:a.常规非虚方法; b.虚方法; 则ph->head()将被如何解释?
- a.调用Corporation::head()
- b.调用PublicCorporation::head()
- 下述代码有什么问题?
class Kitchen
{
private:
double kit_sq_ft;
public:
Kitchen(){kit_sq_ft=0.0;}
virtual double area() const {return kit_sq_ft * kit_sq_ft;}
};
class House: public Kitchen
{
private:
double al_sq_ft;
public:
House(){all_sq_ft+=kit_sq_ft;}
double area(const char* s)const {cout<<s; return all_sq_ft;}
};
- House的构造函数里面all_sq_ft没有初值。
- area函数从基类继承的虚函数,参数不一样。
- 首先,这种情况不符合is-a模型因此公有继承不适用。
- 其次,House中的area()定义隐藏了area()的Kitchen版本,因为这两个方法特征标不同。
- House的构造函数,调用了基类的私有成员,不合法。