【问题标题】:C++ overridden function not called未调用 C++ 覆盖的函数
【发布时间】:2016-02-29 09:54:46
【问题描述】:

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

在文件 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() 被调用。 (我搜索了一下,看了几十篇有超载问题的帖子,但没有看到类似的问题)

有人能指出我正确的方向吗?谢谢!

【问题讨论】:

  • 函数需要virtual才能满足你的需求。

标签: c++ inheritance polymorphism overriding dynamic-binding


【解决方案1】:

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

virtual void print();

【讨论】:

    【解决方案2】:

    print 不是虚函数,所以你只是依赖于静态调度。这将根据对象的静态类型选择要调用的函数,在本例中为obj1

    你应该将print设为虚拟:

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

    那么,如果你使用 C++11,为了安全起见,你可以将 obj2::print 标记为 override

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

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

    【讨论】:

      【解决方案3】:

      我不完全确定,自从我做 c++ 以来,现在是记录时间,但我记得你应该让向量内容是具有纯虚函数的类。

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

      这里有一个堆栈溢出的答案,有点相关:

      Pure Virtual Class and Collections (vector?)

      【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多