读书人

初学stl有点有关问题!

发布时间: 2012-02-19 19:43:38 作者: rapoo

初学stl,有点问题!!!
struct A
{


virtual void display(){cout < < "AAA " < <endl;}
};
struct B :public A
{
void display()
{
cout < < "BBB " < <endl;
}
};
struct C:public A
{
void display()
{
cout < < "CCC " < <endl;
}
}

main()
{

B b;
C c;
list <A> kl;
list <A> ::iterator pos;
kl.push_back(b);
kl.push_back(c);
pos=kl.begin();
pos-> display();
(++pos)-> display();

}

程序输出的是: AAA
AAA

初学stl,有很多不懂。想问一下这是什么原因?还有要实现输出的是 BBB 和 CCC 应该怎么改。

在线等~~~~~~~~~~~~~~~

[解决办法]
在kl里存b,c,相当于:
kl[0] = (A)b;
kl[1] = (A)c;
把B,C转换为A了.

正确写法是:
main()
{

B b;
C c;
list <A*> kl;
list <A*> ::iterator pos;
kl.push_back(&b);
kl.push_back(&c);
pos=kl.begin();
(*pos)-> display();
(*(++pos))-> display();

}

[解决办法]
这样就可以实现输出 BBB CCC
#include <iostream>
#include <list>
using namespace std;
class A
{
public:
virtual void display(){
cout < < "AAA " < <endl;
}
};
class B :public A
{
public:
void display()
{
cout < < "BBB " < <endl;
}
};
class C:public A
{
public:
void display()
{
cout < < "CCC " < <endl;
}
};

void main()
{

B b;
C c;
list <A*> kl;


kl.push_back(&b);
kl.push_back(&c);

list <A*> ::iterator pos = kl.begin();

(*pos)-> display();
pos++;
(*pos)-> display();



}
[解决办法]
程序的关键在

list <BASE *> kl;
如果直接使用

list <BASE> 由于BASE是虚函数 不允许直接实例化
而在list <BASE> 的构造函数

template <class _Tp>
struct _List_node : public _List_node_base {
_Tp _M_data;
__TRIVIAL_STUFF(_List_node)
};
会试图实例化该变量

所以造成错误

读书人网 >C++

热点推荐