作者:qwqwd | 来源:互联网 | 2023-02-05 13:00
1.介绍一下STL,详细说明STL如何实现vector。2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。3.继承和委派有什么分别,在决定使用
1.介绍一下STL,详细说明STL如何实现vector。
2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。
3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。
4.指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;
6.结合一个项目说明你怎样应用设计模式的理念。
7.介绍一下你对设计模式的理解。(这个过程中有很多很细节的问题随机问的)
8.C++和C定义结构的分别是什么。
9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?
10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。
11.结合1个你认为比较能体现OOP思想的项目,用UML来描述。(最好这个项目继承,多态,虚函数都有体现)这个问题大概会占面试时间的一半,并且会问很多问题,一不小心可能会被问住)。
12。基类的有1个虚函数,子类还需要申明为virtual吗?为什么。
13.C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗,难道仅仅是为实现重用。
14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。
15.为什么要引入抽象基类和纯虚函数?
16.介绍一下模板和包容器。如何实现?(也许会让你当场举例实现)
17.你如何理解MVC。简单举例来说明其应用。
18,多重继承如何消除向上继承的二义性。
48 个解决方案
18道题至少也得180分吧...
顺便BS出第二个题的人.
关于"14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。"
我好像在<高质量C++编程指南>第二版中看过,但现在书不在我手上了,请那位大详解一下.
高质量C++编程指南???
强烈建议fangrk先生再次贴出那份经典的文章
基类和子类在内存中的相互关系.可以参看深度探索C++对象模型!
谢谢这位大大了
谁可以用图形的方式表达一下,这样比较直观点?!
Moto面试竟出如此题目,颓势可见一斑矣。
FT
--
Anything one man can imagine, other men can make real.
画出基类和子类在内存中的相互关系,比如有几个实例,画出它们的成员在内存中放置的位置,最好有虚成员,静态成员等.
这一问答对就给全分!
楼上的都能答出来吗>一部分也行
你认为应该出什么样的题目>
14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系
特点:继承,封装,多态.......
如何实现: 迟后编译
内存中的关系:(该问题重点是虚函数),通过virtual table实现
画出基类和子类在内存中的相互关系,比如有几个实例,画出它们的成员在内存中放置的位置,最好有虚成员,静态成员等.
这一问答对就给全分!
不是不可以画出“基类和子类在内存中的相互关系”,关键情况很多,很复杂,要分为单继承,多继承,而且涉及到虚拟继承时,问题往往就发生变化了...
各位了解多少就画多少,可以先从简单的结构开始!
人多力量大!
1 GP
2 refer to MSDN
懒得回答了
感觉都是书本的练习题目
--------------------------------------- 低地址
|vptr |
---------------------------------------
|copy base class nonstatic data members|
---------------------------------------
|derived class nonstatic data members |
--------------------------------------- 高地址
以上是concrete继承的时候,子类对象在内存中的模型(VC中),其中vptr在有虚拟函数的时候存在。
对一个父类和一个子类的情况:
如果父类和子类都没有虚拟函数,那么模型中就没有vptr
父类有虚拟函数,子类没有,那这里的vptr就是父类的
父类没有虚拟函数,子类有,那这里的vptr就是子类的,vc把vptr放在模型的最前面,不同的编译器实现不同。
如果多个父类,一个子类,那么按照继承顺序,如class derived : public base1, public base2...这样,并且父类中有若干个存在虚拟函数,那么模型中的vptr就是第一个出现的父类的模型中的vptr,其它后继出现的父类的vptr和子类的都在这个vptr中扩展,这样,在最终子类的模型中总是只有一个vptr,而各父类的nonstatic data members按继承顺序排在vptr之后。
至于虚拟继承,concrete继承复杂,不过最主要的就是当出现这样的情况的时候:
一个父类A有2个虚拟派生的子类B1和B2,这2个子类又都是一个类C的父类(这里是concrete继承),那么这个C类里不会有2份A的nonstatic data members的拷贝,只有一份。这是因为A类派生B1和B2的时候是虚拟继承,如果是concrete继承,那C就会有2份A的拷贝。虚拟继承的实现方式,不同的编译器实现不同,有种是通过指针来指示,这样当共同派生一个子类的时候,可以消除冗余。
如标准库里的io库,ios的两个子类istream和ostream,还有istream和ostream的子类iostream就是这样的情况。
唉 这些题感觉自己大部分了解
可是真要在面试的时候说清楚 不之前好好准备一下 一定会被bs的
有没有高手给总结一下答案
不错的题目,要总结齐这些答案,不是三言两语....
全部都在 高质量C++编程指南 这本书中
看来这也是一个窍门呀
Jinhao(辣子鸡丁·GAME就这样OVER了) 看完了?????
“3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。”
这里“委派”是指什么啊?组合吗?
#include
#include
class ClassA
{
public:
static int m_staticData;
int m_data1;
int m_data2;
void func1() { }
void func2() { }
virtual void vfunc1() { }
virtual void vfunc2() { }
ClassA(){m_data1 = 1;m_data2 = 2;m_dataPrivate3 = 3;m_dataPrivate4 = 4; }
private:
int m_dataPrivate3;
int m_dataPrivate4;
};
class ClassB : public ClassA
{
public:
int m_data3;
void func2() { }
void vfunc3() { }
void vfunc4() { }
};
class ClassC : public ClassB
{
public:
int m_data1;
int m_data4;
void func2() { }
virtual void vfunc1() { }
};
void main( )
{
cout << "size of ClassA: "<< sizeof(ClassA) << endl;
cout << "size of ClassB: "<< sizeof(ClassB) << endl;
cout << "size of ClassC: "<< sizeof(ClassC) << endl;
ClassA a;
ClassB b;
ClassC c;
cout << "size of ClassA a: "<< sizeof(a) << endl;
cout << "size of ClassB b: "<< sizeof(b) << endl;
cout << "size of ClassC c: "<< sizeof(c) << endl;
b.m_data1 = 11;
b.m_data2 = 22;
b.m_data3 = 33;
c.m_data1 = 111;
c.ClassA::m_data1 = 112;
c.m_data2 = 222;
c.m_data3 = 333;
c.m_data4 = 444;
cout << "classb data: " << endl ;
cout << "b.m_data1: " < cout << "b.m_data2: "<< b.m_data2 << endl ;
cout << "b.m_data3: "<< b.m_data3 << endl ;
// b.m_staticData = 1;
// cout << "b.m_staticData"<< b.ClassA::m_staticData < //编译通过,但会有连接错误。
cout << "classc" << endl ;
cout << "c.m_data1: " << c.m_data1 << endl ;
cout << "c.ClassA::m_data1: " << c.ClassA::m_data1<< endl ;
cout << "c.m_data2: " << c.m_data2 << endl ;
cout << "c.m_data3: " << c.m_data3 << endl ;
cout << "c.m_data4: " << c.m_data4 << endl ;
cout << "\nclassb address" << endl ;
cout << &b << endl ;
cout << &(b.m_data1) << endl ;
cout << &(b.m_data2) << endl ;
cout << &(b.m_data2)+1 <<": ClassA m_dataPrivate3 is "<<*(&(b.m_data2) + 1)<< endl ;
cout << &(b.m_data2)+2 <<": ClassA m_dataPrivate4 is "<<*(&(b.m_data2) + 2)<< endl ;
cout << "\nclassc address" << endl ;
cout << &c << endl ;
cout << &(c.m_data1) << endl ;
cout << &(c.m_data2) << endl ;
cout << &(c.m_data3) << endl ;
cout << &(c.m_data4) << endl ;
cout << &(c.ClassA::m_data1) << endl ;
}
这是我最近学c++的一些理解,不知道对不对,各位大虾指教:
(1) ClassA 里面的m_staticData 的存储空间是分配在静态数据区的。
如:在ClassA增加了一个static int m_staticData , sizeof(ClassA)或sizeof(a)和不加前是一样的。
(2) static 类型变量 ,是不能被继承的。
引用b.m_staticData不能通过连接,
b.ClassA::m_staticData的引用也不能通过连接。
(3) 父类其他的变量无论是public protected 还是private 型的在内存分配上都被子类继承过来了,我们可以看到 sizeof(ClassB) = sizeof(ClassA) + sizeof(m_data3)。
(4)
当子类定义的变量与基类同名时,如果父类的这个变量在子类中是可见的,则在访问上被覆盖。
如:c.m_data1 = 111; c.ClassA::m_data1 = 112;
然而,可以看出在内存上仍然是两快不同的空间保存的。
(5) 即便父类的变量在子类中不可见,它在子类的实例中仍然是分配了内存了的,甚至是被初始化过的。 下面的代码就访问到了父类中两个私有变量。
cout << &(b.m_data2)+1<<": ClassA m_dataPrivate3 is "<<*(&(b.m_data2) + 1)< cout << &(b.m_data2)+2<<": ClassA m_dataPrivate4 is "<<*(&(b.m_data2) + 2)<
(6)
变量的地址安排是按定义的顺序来的,并且先父类再子类。如 ClassB 中的地址是这样安排的:
虚函数表指针 __vfptr 4byte (如果父类子类中都没有虚函数就没有这个指针)
父类ClassA中 m_data1 4byte (子类可见)
父类ClassA中 m_data2 4byte (子类可见)
父类ClassA中 m_dataPrivate3 4byte (子类不可见)
父类ClassA中 m_dataPrivate3 4byte (子类不可见)
子类ClassB中 m_data3 4byte
所以sizeof(ClassB) = 24;
(7)对于一个类来说,他的函数是其各个实例共享的,而变量则是每个实例都有单独的一份。
关于继承的中的虚函数:由一个虚函数表指针 __vfptr 来维护。这个表里面纪录了各个虚函数代码段的地址。
我们可以设断点察看&a &b &c中的__vfptr,如果子类重载了父类的虚函数则相应的函数地址改变,否则仍然指向父类的虚函数代码段地址。