目录
- #include
- #include
- 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