std :: vector <base_class *>使用base进行迭代,但调用派生类函数

时间:2019-05-15 01:54:21

标签: c++ c++11 polymorphism

class c_base_class {  
protected:
    . . .
public:
    void run( ) { 
        std::cout << "Error: Run called from base class! \n";
    };    

};

class c_derived_class : public c_base_class {
protected:
    . . .
public:
    void run( ) {
        std::cout << "Success: Run called from derived class \n";
    };    

class c_main {
protected:    
    std::vector<c_base_class*> listings;
public:
     void push_base( c_base_class* base ) { listings.push_back( base ); }; 

    void iterate ( ) {
        for ( auto listing : listings) {
            listing->run( );
        };
    };

    void run( ) {
        this->iterate( );
    };
}; extern c_main* g_main;
. . .

void some_stuff::run( ) {
    g_main->push_base( std::make_unique<c_derived_class>( . . . ).get( ) );
    g_main->run( ); // Iterator calls base class 'run' function instead of derived classes 'run' function.
};

请原谅任何错误/错误。我在这里写的纯粹是伪造的,我认为这是可以理解的。

如果不是这种解释的方式,则存在多个派生类,因此仅具有一个向量将毫无用处。我想从派生类调用run,而只是将基类推回向量中,如代码所示,但是迭代器只调用基类run函数。

2 个答案:

答案 0 :(得分:2)

听起来好像您想将该函数虚拟化? (即,它调用派生类提供的版本(如果有)

class c_base_class {  
protected:
    . . .
public:
    virtual void run( ) { 
        std::cout << "Error: Run called from base class! \n";
    }

};

答案 1 :(得分:0)

首先,错误。

g_main->push_base( std::make_unique<c_derived_class>( . . . ).get( ) );

在这一行中,唯一指针将立即取消分配内容。这样您就可以在代码中获得指向垃圾的指针。

更改

...
std::vector<c_base_class*> listings;
...
g_main->push_base( std::make_unique<c_derived_class>( . . . ).get( ) );
...

...
std::vector<std::unique_ptr<c_base_class> > listings;
...
g_main->push_base( std::make_unique<c_derived_class>( . . . ));
...
除此之外。基类函数run()必须是虚拟的。例如,

virtual void run( ) {...};

virtual表示在运行时程序需要检查要调用的函数。它尝试调用实现该功能的最后一个派生类。