繁体   English   中英

C ++重写函数未调用

[英]C++ overridden function not called

我遇到一个问题,其中没有调用重载函数,而是调用了基本函数。 我怀疑这与项目文件之间的拆分方式有关。

在文件obj1.h / obj1.cpp中,我有这样的内容

class obj1{
public:
    void print();
};

void obj1::print(){
    cout << "obj1::print()";
}

在文件obj2.h / obj2.cpp中,我有类似以下内容:

#include "obj1.h"   
class obj2 : public obj1{
public:
    void print();
};

void obj2::print(){
    cout << "obj2::print()";
}

在单独的文件中,我执行以下操作:

#include "obj1.h"   
class obj3{    
public:
    vector<obj1*> objlist;
    void printobjs();
    void addobj(obj1* o);
};

void obj3::printobjs(){
    vector<obj1*>::iterator it;
    for (it=objList.begin(); it < objList.end(); it++)
        (*it)->print();

void obj3::addobj(obj1* o){
    objlist.push_back(o);
}

然后在另一个文件中:

#include "obj2.h"
obj3 o3;
main(){
    obj2* newobj2;
    newobj2 = new obj2();
    o3.addobj(newobj2);

    o3.printobjs();

我的问题是printobjs()导致obj1.print()被调用。 (我进行了一些搜索,并阅读了几十篇有关超载问题的帖子,但没有看到类似的问题)

有人可以为此指出正确的方向吗? 谢谢!

print不是虚拟函数,因此您仅依赖静态调度。 这将根据对象的静态类型(在这种情况下为obj1选择要调用的函数。

您应该将print虚拟化:

class obj1{
public:
    virtual void print();
};

然后,如果您使用C ++ 11,为了安全起见,可以将obj2::print标记为override

class obj2 : public obj1{
public:
    void print() override;
};

还要注意,您永远不会为newobj2分配任何内存。

您应该将print()声明为虚拟的,以便为obj2对象调用obj2 :: print()。

virtual void print();

我不完全确定,自从我使用c ++以来已经是登录时间了,但是我记得您应该让vectors内容成为具有纯虚函数的类。

那应该迫使它查找正确的方法。

这里有一个堆栈溢出答案,该答案与以下内容略有相关:

纯虚拟类和集合(向量?)

暂无
暂无

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

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