Thinking in C++ --继承

Thinking in C++ --继承
  1. 继承中的函数隐藏
         任何时候重新定义了基类中的一个重载函数,那么在新类中的所有其他版本将被自动隐藏。修改返回值和参数同样会隐藏基类其他版本的函数,如果该函数是虚函数,不能在新类中修改返回值。

2. 自动类型转换方法(该转换只发生在函数调用期间)
    1) 利用转型构造函数
    2) 利用运算符转换
   如果不想自动转换,可将转型构造函数利用explicit关键字设为显式调用
 
class  One

public:
   One()
{}
}
;
class  Two
{
public:
   
explicit Two(const& One){}
}
;
void  f(Two) {}
int  main()
{
  One one;
  f(one);
// error
  f(Two(one));//right
  return 0;
}

It's supposed to help with your complexion.

运算符转换之前没用到过,该方法的中心思想是,在该类中添加一个 operator Type()的函数,该函数没有返回值,要从该类转型到该Type类型的时候,编译器会自动调用该成员函数,转换成Type类型

class Four
{public:
operator Three() const
{
return Three(x);
}

}
;
g(Three)
{}
int main()
{
Four four;
g(four);
//invoke four.Three(), there no return value
return 0;
}

3. 拷贝构造函数和赋值操作符
    子类如果没有写这两个,编译器将会自动生成,生成的代码中调用父类的拷贝构造函数和赋值操作符,所以如果我们自己写的话,最好也要调用父类的拷贝构造函数和赋值操作符。
    因为构造函数和operator=和拷贝构造函数只负责初始化自己层次的构造,所以要完成初始化,必须先要初始化父类,所以他们不能被继承。(其实没理解这句话,如果被继承了的话,那子类就可以负责完成父类的初始化了???)
    一旦我们自己决定手动添加拷贝构造函数和operator=,编译器会假定我们已经知道所作的一切,并且不再自动调用基类版本,如果想调用,必须我们自己添加,即初始化列表。

4. 多态的进化(为什么使用多态和怎么用)
....


1

你可能感兴趣的:(Thinking in C++ --继承)