繁体   English   中英

C ++使用迭代器访问向量的指针元素

[英]C++ accesing pointer elements of a vector with iterator

使用下面显示的代码,我创建了4个类(3个子类和一个超类),每个类具有相同的print_info()函数。 我已经从每个类创建了指针对象,并将它们插入到使用超类创建的向量中。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;

class Vehicle
{
    private:
        int wheels, max_speed;
        string model;
    public:
        virtual void print_info()
        {
             cout << "This is function print_info() in Vehicle (parent class)" << endl; 
        }
};

class Car: public Vehicle
{
    private:
        int doors, passengers;
    public:
        void print_info()
        {
             cout << "This is function print_info() in Car (child class)" << endl;
        }
};

class Bike: public Vehicle
{
    private:
        string owner;
        bool hasLights;
    public:
        string my_owner();
};

class Truck: public Vehicle
{
    private:
        float cargo_weight;
        int allowed_speed;
    public:
        void print_info()
        {
            cout << "This is function print_info() in Truck (child class)" << endl;
        }
};

int main()
{
    Vehicle *v1 = new Vehicle();
    Vehicle v2;
    Car c1;
    Car c2;
    Bike b1;
    Truck t1;
    Truck t2;

    vector <Vehicle> vvec;
    Vehicle *v = new Vehicle();
    Car *c = new Car();
    Bike *b = new Bike();
    Truck *t = new Truck();
    vvec.push_back(*v);
    vvec.push_back(*c);
    vvec.push_back(*b);
    vvec.push_back(*t);

    vector<Vehicle>::iterator iter = vvec.begin();
    while( iter != vvec.end()) 
    {
        iter->print_info();
        iter++;
    }

    v1 = &v2;
    v1->print_info();
    v1 = &c2;
    v1->print_info();
    v1 = &t2;
    v1->print_info();
    system("pause");

    return 0;
}

所需的输出是这样的:

这是Vehicle(父类)中的函数print_info

这是Car(子类)中的函数print_info

这是Vehicle(父类)中的函数print_info

这是Truck(子类)中的函数print_info

这是Vehicle(父类)中的函数print_info

这是Car(子类)中的函数print_info

这是Truck(子类)中的函数print_info

相反,我得到:

这是Vehicle(父类)中的函数print_info

这是Vehicle(父类)中的函数print_info

这是Vehicle(父类)中的函数print_info

这是Vehicle(父类)中的函数print_info

这是Vehicle(父类)中的函数print_info

这是Car(子类)中的函数print_info

这是Truck(子类)中的函数print_info

我相信这是由于早期绑定所致,但我不知道该如何解决!

您需要创建指针vector <Vehicle*> vvec; ,当您像vvec.push_back(*v);一样push_back时vvec.push_back(*v); 您通过值传递元素并将其转换为Vehicle ,因此不会有多态性,因为vector的所有元素只是简单的Vehicle对象,请更改为:

//...
vector <Vehicle*> vvec;

Vehicle *v = new Vehicle();
Car *c = new Car();
Bike *b = new Bike();
Truck *t = new Truck();
vvec.push_back(v);
vvec.push_back(c);
vvec.push_back(b);
vvec.push_back(t);

vector<Vehicle*>::iterator iter = vvec.begin();
while( iter != vvec.end())
{
    (*iter)->print_info();
    iter++;
}
//...

您的输出将是:

This is function print_info() in Vehicle (parent class)
This is function print_info() in Car (child class)
This is function print_info() in Vehicle (parent class)
This is function print_info() in Truck (child class)
This is function print_info() in Vehicle (parent class)
This is function print_info() in Car (child class)
This is function print_info() in Truck (child class)

这是对象切片的经典示例。

当取消引用指针以将其插入向量vvec.push_back(*v) ,会将其转换为基类类型。 因此,它现在表现为“车辆”。

如果要获得预期的行为,请尝试使用vector <Vehicle*> vvecvvec.push_back(v)

您想要的是多态性,因此您必须存储Vehicle引用或Vehicle指针。 而且,由于您不能将引用存储在vector ,因此要使用指针。

vector <Vehicle*> vvec;

然后只需按下指针并调用print_info将触发多态行为

    vvec.push_back(v);
    vvec.push_back(c);
    vvec.push_back(b);
    vvec.push_back(t);

    vector<Vehicle*>::iterator iter = vvec.begin();
    while( iter != vvec.end())
    {
        (*iter)->print_info();
        iter++;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM