基类和派生类

对象类型:静态类型和动态类型。静态类型是在编译时就已经知道的类型。动态类型是在内存中的对象,直到运行时才知道类型。
如果基类base中有虚函数,派生类sub继承基类,在初始化时:
1、通过类定义的基类对象,用派生类去初始化基类时,基类对象不会转化为派生类对象,即基类对象调用的函数还是自己内部写的;
2、通过指针,定义的基类对象,用派生类去初始化时,会将此基类对象转化为派生类对象,即调用的重载函数是派生类内部的函数,和基类的函数无关。即:基类的指针或引用可以绑定的派生类对象上,这也就对于工厂模式最好的利用。可以通过基类的调用,在程序运行中,根据不同的配置,去实例化不同的版本的对象。例如db2类和oracle类。
3、基类中有虚函数,对基类实例化对象以后,该对象仍能够调用该虚函数,且能执行。当使用基类的指针或引用时,调用一个虚函数会执行动态绑定,即直到运行时才知道调用了哪个版本的虚函数,所以所有的虚函数都必须有定义,不管是否用到,因为连编译器也无法确定到底会使用哪个虚函数;
4、记住:动态绑定只有当通过指针或引用调用虚函数时才会发生。当通过一个具有普通类型而非指针或引用,调用虚函数时,在编译时就会将调用的版本确定下来。
5、基类中的虚函数,则在其以后的所有派生类中都是虚函数。所以不必在派生类中还对重载的虚函数使用virtual。
代码如下:

#include<iostream>
using namespace std;

class base
{
public:
    //base(int temp):s(temp){}
    void dog()
    {
        cout<<"dog"<<endl;
    }
    virtual void animal()
    {
        cout<<"animal"<<endl;
    }
    //int s;
};

class sub:public base
{
public:
    //sub(int temp):base(temp){}
    void animal() override
    {
        cout<<"my animal"<<endl;
    }
    void our()
    {
        cout<<"our"<<endl;
    }
};
void main()
{
    /*sub sub1;
    base parent(sub1);
    parent.animal();//输出animal
    system("pause");*/
    base  *parent = new sub();
    parent->animal();//输出:my animal
    system("pause");
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值