Advertisement

趋势科技笔试【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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/lQfJxjzwHXZOom7u63dgKT2NpFyI.png)

结果:

解释:

为何构造函数与析构函数为何能各自调用本类中的方法f()而非多态生成的实际类型?

答:因为CA的构造函数属于CA类型,在该类型中调用f()时只会触发CA自身的;类似地,在析构函数中也会遵循这一规则。

2. func()的调用为什么会输出this is B?

回答:这表明这是多态性的应用场景之一。因为使用了virtual关键字,在C++语言中,默认情况下每个类都有一个空虚的方法(如func())。当*p指针所访问到的CA对象中包含该方法时(即调用func()),触发实例化的过程,并通过动态绑定机制将这个调用转换为对应的实际实现方法(即CB类中的func()),从而输出结果为this is B.

要调用基类的函数,可以用基类CA::来限定。

全部评论 (0)

还没有任何评论哟~