继承与派生
继承的本质:代码复用
当派生类继承基类时,继承了
- 基类的作用域
- 除构造函数以及析构函数以外的所以成员
继承的方式:(三种)
公有继承(public),保护继承(protect),私有继承(private)
继承写法:
类标识 类名 : 继承方式 基类名称
派生对象的构造和析构方式的顺序:
1.派生类对象的构造
1.系统调用基类的构造
2.系统调用派生类的构造
2.派生类对象的析构
1.系统调用派生类的析构
2.系统调用基类的析构
基类中不同访问限定符下的成员以不同继承方式继承后在派生类中的访问限定
- public: 任意位置访问
- protected: 本类,子类类中访问
- private: 本类类中
类和类的关系
- 组合 a part of has_a
- 继承 a kind of is_a
- 代理
同名函数的关系
1.重载 overload 重定义
三要素
1.同名
2.不同参数
3.同作用域
2.隐藏 overhide
派生类中隐藏了基类中所有的同名函数
1.同名
2.不同作用域 (继承)
3.覆盖 override 重写
类或派生类指针或引用的相互指向或引用
允许基类指针或引用 指向或引用派生类对象,反之,不允许
class Base
{
public:
void fun1(){cout << "Base::fun1\n";}
virtual void fun2(){cout << "Base::fun2\n";}
void fun3(){cout << "Base::fun3\n";}
};
class Derived : public Base
{
public:
void fun1(){cout << "Derived::fun1\n";}
void fun2(){cout << "Derived::fun2\n";}
void fun3(){cout << "Derived::fun3\n";}
void fun4(){cout << "Derived::fun4\n";}
};
void f(Base &b)
{
b.fun1();
b.fun2();
}
int main()
{
Derived obj;
f(obj);
Base * p1 = new Base;
//p1->fun2();
//基类指针指向派生类对象,调用不了子类中的方法
Base * p2 = new Derived;
p2->fun1(); //调用基类fun1
p2->fun2(); //调用派生类fun2
p2->fun3(); //调用基类fun3
//派生类指针指向派生类的对象时
Derived * p3 = new Derived;
p3->fun1(); //调用派生类fun1
p3->fun2(); //调用派生类fun2
p3->fun3(); //调用派生类fun3
p3->fun4(); //调用派生类fun4
system("pause");
return 0;
}