趋势科技笔试【6】
发布时间
阅读量:
阅读量
题目:请问下面的程序输出是什么?
// test3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class CA
{
public:
CA(){cout << "ca ....."<<endl;f();};
virtual ~CA(){f();};
void func(){f();};
virtual void f(){cout << "this is A" <<endl;};
};
class CB:public CA
{
public:
CB(){cout << "cb....." <<endl;f();};
virtual ~CB(){f();};
void func(){f();};
virtual void f(){cout << "this is B" <<endl;};
};
int _tmain(int argc, _TCHAR* argv[])
{
CA* p = new CB;
cout << "============================="<<endl;
p->func();
p->CA::func();
p->CA::f();
cout << "============================="<<endl;
delete p;
getchar();
return 0;
}
cpp

结果:

解释:
为何构造函数与析构函数为何能各自调用本类中的方法f()而非多态生成的实际类型?
答:因为CA的构造函数属于CA类型,在该类型中调用f()时只会触发CA自身的;类似地,在析构函数中也会遵循这一规则。
2. func()的调用为什么会输出this is B?
回答:这表明这是多态性的应用场景之一。因为使用了virtual关键字,在C++语言中,默认情况下每个类都有一个空虚的方法(如func())。当*p指针所访问到的CA对象中包含该方法时(即调用func()),触发实例化的过程,并通过动态绑定机制将这个调用转换为对应的实际实现方法(即CB类中的func()),从而输出结果为this is B.
要调用基类的函数,可以用基类CA::来限定。
全部评论 (0)
还没有任何评论哟~
