目录
第一题(迭代器指向问题)
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();itor++)
{
if(*itor==300)
{
itor=array.erase(itor);
}
}
for(itor=array.begin();itor!=array.end();itor++)
{
cout<<*itor<<"";
}
return 0;
}
上面这个代码输出的是()
A 100 300 300 300 300 500
B 100 300 300 300 500
C 100 300 300 500
D 100 300
100 300 300 300 300 500
here
100 300 300 300 500
here
100 300 300 500
here
由于我们erase删除掉了一个元素之后,我们后面的元素是会向前挪动的,但是我们又人为地将迭代器++,所以按照我们上面的解释,有两个300没有成功删掉
C
第二题(虚函数的机制在构造和析构函数里面不会发生作用)
下面这段程序的输出是什么?
class A{
public:
A(){p();}
virtual void p(){print("A")}
virtual ~A(){p();}
};
class B:public A{
public:
B(){p();}
void p(){print("B")}
~B(){p();}
};
int main(int, char**){
A* a=new B();
delete a;
}
A AABB
B BBAA
C ABAB
D ABBA
虚函数的机制在构造和析构函数里面不会发生作用
如果构造函数是虚函数,多态不会发生作用。因为构造的时候,对象还没有构造完成。
析构函数声明成虚函数,我们的多态也不会产生,按照栈的规则,先析构子类,然后析构父类,那么如果虚机制还在运行,那么我们的子类已经被析构了,父类还想要去调动子类的同名函数,是不可能的
释放父类的指针,会不会析构子类取决于有没有将父类的析构函数写成虚方法。
先创建一个B对象,先构造A
由于我们上面所解释的多态不发挥作用,所以先打印一个A。
然后构造B,B对象只能调动自己的构造函数,打印B
然后再析构的时候,由于我们的父类的析构是虚函数,所以先析构子类,打印出一个B
然后再析构父类,打印出一个A
也就是ABBA
D
第三题(多态)
以下代码的运行结果为()
class Base {
public:
Base() {
echo();
} virtual void echo() {
printf("Base");
}
};
class Derived:public Base {
public:
Derived() {
echo();
}
virtual void echo() {
printf("Derived");
}
};
int main() {
Base* base = new Derived();
base->echo();
return 0;
}
A DerivedDerivedDerived
B DerivedBaseDerived
C BaseDerivedBase
D BaseDerivedDerived
虚函数的机制在构造和析构函数里面不会发生作用
所以想要构造子类,就要先构造父类
父类再构造的时候,虚机制不起作用,所以直接打印出一个Base
然后子类构造,调用自己的构造函数,打印出Derived
然后base是一个父类的指针,指向子类的对象,然后我们的echo又是虚函数,满足多态的调用条件,所以我们这里调用的是子类的echo函数,也就是再打印出一个Derived
也就是D
D