C++17——多态性

class XYPos{ ... };  //x,y point
class Shape{
public:
	Shape();
    virtual ~Shape();
    virtual void render();//virtual 表示这个render()和子类的render()有联系
    void move(const XYPos&);
    virtual void resize();
protected:
    XYPos center;
};
class Ellipse:public Shape{
public:
    Ellipse(float maj,float minr);
    virtual void render();//这个virtual可加可不加,父类的函数有virtual,子类的同名函数都是virtual类型的
protected:
    float major_axis,minor_axis;
};
class Circle:public Ellipse{
public:
    Circle(float radius):Ellipse(radius,radius){ }
    virtual void render();
};
void render(Shape* p){//p是多态的,如果render是virtual的,则p是动态绑定,否则是静态绑定,动态绑定构成了多态
    p->render();
}
void func(){
    Ellipse ell(10,20);
    ell.render();
    Circle circ(40);
    circ.render();
    render(&ell);//upcast virtual的作用,通过指针或者引用调用函数时,不能直接使用写好的Shape类中的函数,而是要到运行时,调用Ellipse类中的函数
    render(&circ);//调用Circle类中的函数
}

任何类只要有虚函数,这个类就会比正常的类大一点。

#include <iostream>
using namespace std;
class A{
public:
    A():i(10){}
    virtual void f(){ cout<<"A::f()"<<i<<endl; }//含有virtual函数的类,内存最上面是指向虚函数的指针,之后才是i的值
    int i;
};
class B:public A{
public:
    B():j(20){}
    virtual void f(){cout<<"B::f()"<<j<<endl;}
    int j;
}
int main(){
    A a;
    B b;
    A* p=&b;
    p->f(); //p会指向b的f()
    
    a=b;
    a.f();//a的f(),通过指针调用virtual才会是动态绑定,通过.调用不是动态绑定
    
    p=&a;
    p->f();//a的f()
    
    cout<<sizeof(a)<<endl;//8
    
    int *p=(int*)&a;//*p = 835680
    p++;
    cout<<*p<<endl;//*p=10
}

 

 如果类中有virtual函数,则析构必须也是virtual

class Base{
public:
    virtual void func();
};
class Derived:public Base{
public:
    virtual void func();//overrides 覆盖
};
void Derived::func(){
    cout<<"In Derived::func!";
    Base::func();//调用父类的func(),直接写的话,默认调用Derived的func()
}
class Expr{
public:
    virtual Expr* newExpr();
    virtual Expr& clone();
    virtual Expr self();
};
class BinaryExpr:public Expr{
public:
    virtual BinaryExpr* newExpr(); //对,返回指针
    virtual BinaryExpr& clone(); //对,返回引用
    virtual BinaryExpr self(); //错,不能直接返回对象本身
};
//通过指针和引用才构成向上造型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值