欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序员面试宝典-面向对象

程序员文章站 2024-02-04 13:53:04
...

  • 考察虚函数重载
class Parent
{
    public :
    virtual void foo(){cout<<"Parent"<<endl;}
    void fool(){cout<<"Parent"<<endl;}
}

class Son:public Parent
{
    public :
    void foo(){cout<<"Son"<<endl;}
    void fool(){cout<<"Son"<<endl;}
}

int main()
{
    Parent *p=new Son();
    p->foo();
    p->fool();
    return 0;
}
输出结果:
Son

Parent

题目解析:

虚函数会被子类同名函数覆盖,而普通函数不会被覆盖。


  • 考察虚函数覆盖虚函数
class A
{
public :
void virtual f(){cout<<"A"<<endl;}
}

class B:public A
{
public :
void virtual f(){cout<<"B"<<endl;}
}

int main
{
A* pa=new A();
A->f();
B* pb=(B*)pa;
B->f();

delete pa,pb;

pa=new B();
pa->f();

pb=(A*)pa;
pb->f();
}

输出结果:
A
A
B

B

题目解析:

pb=(B*)pa,意为将pa转化为B类型指针,然后再赋值给pb,此间pa未发生变化,pb仍指向pa的f()函数,故此时pb->f()结果为A;清除内存后,pa重新指向B类,此时发生覆盖,故pa->f()结果为B;此时pa转化为B类,并赋值给pb,pb指向B类型的f()函数,结果为B。


  • 考察虚继承

圆角矩形同时具有圆和矩形的两种属性,也即是圆角矩形同时继承于圆和矩形,而圆和矩形同时继承于shape类型,那么在一个圆角矩形类*创建了几个shape?

结果:如果圆和矩形同时用virtual关键字继承shape,则只创建了1个共享的shape;否则,则创建了2个shape。


  • 考察纯虚函数
class shape
{
    public :
    shape();
    ~shape();
    virtual void Draw()=0;
}

int main()
{
    shape sp;
    return 0;
}

以上代码错在哪里?

结果:纯虚函数不能实例化,需要将其改为普通虚函数,即 virtual void Draw(){}。