程序员面试宝典-面向对象
程序员文章站
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(){}。
上一篇: 监听EditText输入完成