您的位置:首页 > 编程语言 > C语言/C++

C++面试题(五)

2016-09-26 15:51 260 查看
C++的空类,默认产生哪些类成员函数?

答:

class Empty
{
public:
Empty();                           //缺省构造函数
Empty(const Empty& );           //拷贝构造函数
~Empty();                          //虚构函数
Empty& operator(const Empty& )     //赋值运算符
}


简单叙述面向对象的三个基本特征

答:封装性即把客观事物封装成抽象的类,对自身的数据和方法进行(public,private, protected)
继承性
继承概念的实现方式有三类:实现继承、接口继承和可视继承。
实现继承是指使用基类的属性和方法而无需额外编码的能力;
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class
多态性
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,
父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。允许将子类类型的指针赋值给父类类型的指针。
实现多态,有二种方式,覆盖(子类重新定义父类的虚函数),重载(允许存在多个同名函数,参数个数,类型不同)。


C++中哪些函数不能被声明为虚函数?

答:普通函数(非成员函数),构造函数,内联成员函数、静态成员函数、友元函数。
(1)虚函数用于基类和派生类,普通函数所以不能
(2)构造函数不能是因为虚函数采用的是虚调用的方法,允许在只知道部分信息的情况的工作机制,
特别允许调用只知道接口而不知道对象的准确类型的方法,但是调用构造函数即使要创建一个对象,
那势必要知道对象的准确类型。
(3)内联成员函数的实质是在调用的地方直接将代码扩展开
(4)继承时,静态成员函数是不能被继承的,它只属于一个类,因为也不存在动态联编等
(5)友元函数不是类的成员函数,因此也不能被继承


C++编译器自动为类产生的四个确缺省函数是什么?

答:默认构造函数,拷贝构造函数,析构函数,赋值函数


构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?

答:
构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。
析构函数可以为纯虚函数


构造函数和析构函数的调用顺序? 析构函数为什么要虚拟?

答案:构造函数的调用顺序:基类构造函数—对象成员构造函数—派生类构造函数;析构函数的调用顺序与构造函数相反。析构函数虚拟是为了防止析构不彻底,造成内存的泄漏。


是不是一个父类写了一个 virtual 函数,如果子类覆盖它的函数不加 virtual , 也能实现多态 ?

答: virtual 修饰符会被隐形继承的。 private  也被继承,只是派生类没有访问权限而已。 virtual 可加可不加。子类的空间里有父类的所有变量 (static 除外 ) 。同一个函数只存在一个实体 (inline 除外 ) 。子类覆盖它的函数不加 virtual , 也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问


当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,请解释一下编译器为什么没有让它为零。

答案:为1。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了


怎样消除多重继承中的二义性?

答: 1.成员限定符  2.虚基类


什么叫静态关联,什么叫动态关联

答:在多态中,如果程序在编译阶段就能确定实际执行动作,则称静态关联,
如果等到程序运行才能确定叫动态关联。


多态的两个必要条件

答:1.一个基类的指针或引用指向一个派生类对象  2.虚函数


什么时候需要用虚析构函数?

答:当基类指针指向用new运算符生成的派生类对象时,delete基类指针时,派生类部分没有释放掉而造成释放不彻底现象,需要虚析构函数。 补充:虚函数就是让派生类调用基类的虚函数。


13.怎样定义一个纯虚函数?含有纯虚函数的类称为什么?

答:在虚函数的后面加=0,含有虚函数的类称为抽象类。


什么时候必须重写拷贝构造函数?

答:当构造函数涉及到动态存储分配空间时,要自己写拷贝构造函数,并且要深拷贝。


构造函数的调用顺序是什么?

答:1.先调用基类构造函数
2.按声明顺序初始化数据成员
3.最后调用自己的构造函数。


构造函数和析构函数是否可以被重载,为什么?

答:构造函数可以被重载,析构函数不可以被重载。因为构造函数可以有多个且可以带参数,而析构函数只能有一个,且不能带参数。


说一下 C++ 中 static_cast 和 dynamic_cast 的区别。

答: static_cast  用于有比较明确定义的变换,包括不需要强制转换的变换。
dynamic_cast  适用于类型安全的向下转换,常用在继承中的父类指针向子类指针的转换。若转换成功则返回改类型的指针,若失败,则返回 NULL


类成员函数的重载、覆盖和隐藏区别?

答:
a. 成员函数被重载的特征:
( 1 )相同的范围(在同一个类中);
( 2 )函数名字相同;
( 3 )参数不同;
( 4 ) virtual  关键字可有可无。
b. 覆盖是指派生类函数覆盖基类函数,特征是:
( 1 )不同的范围(分别位于派生类与基类);
( 2 )函数名字相同;
( 3 )参数相同;
( 4 )基类函数必须有 virtual  关键字。
c. “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
( 1 )如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。
( 2 )如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual  关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)


#i nclude
using namespace std;
class Base
{
public:
virtual ~Base() { cout "~Base" endl ; }
};
class Derived : public Base
{
public:
virtual ~Derived() { cout "~Derived" endl ; }
};
void main(void)
{
Base * pB = new Derived; // upcast
delete pB;
cin.get();
}

//输出结果为:
~Derived
~Base
//如果析构函数不为虚,那么输出结果为
~Base
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: