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函数。
答案 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
表示在运行时程序需要检查要调用的函数。它尝试调用实现该功能的最后一个派生类。