C ++抽象基类调用自己的纯虚函数导致“未定义的引用”

时间:2012-03-26 19:19:03

标签: c++ function virtual abstract-class

我有一个基类:

class Foo {
   public:
       virtual ~Foo() {}
       static void printFoos()
       {
           std::vector<Foo*>::iterator it;
           for(it=fooList.begin();it!=fooList.end();++it)
           {
               std::cout<<"Class: "<<(*it)->getClassName()<<"\n";
           }
       }
       virtual const char* getClassName()=0;
       static std::vector<Foo*> fooList;
};

还有一些派生类,例如:

class Bar : public Foo {
    public:
        Bar();
    private:
        const char* getClassName()
        {
            return "Bar";
        }
};

上面的代码给出了对Foo :: getClassName()的未定义引用,我假设因为代码想要调用Foo :: getClassName(),但是如何让它像正常的虚拟调用那样调用函数? I.E.如何让它从Foo里面调用Bar :: getClassName()?

编辑:忘记继承东西

3 个答案:

答案 0 :(得分:0)

bar似乎没有继承foo。您需要声明继承:

class bar: public foo { ...

答案 1 :(得分:0)

必须使用fooListnew创建fooList[0] = new Bar()中的项目。正如WeaselFox所说,Bar必须继承Foo

答案 2 :(得分:0)

有两件事未定义:

Bar::Bar() is undefined

-   Bar();
+   Bar() {}

和fooList未定义:

+std::vector<Foo*> Foo::fooList;

以下是更正的程序:

TEST.CPP:

#include <vector>
#include <iostream>

class Foo {
   public:
       virtual ~Foo() {}
       static void printFoos()
       {
           std::vector<Foo*>::iterator it;
           for(it=fooList.begin();it!=fooList.end();++it)
           {
               std::cout<<"Class: "<<(*it)->getClassName()<<"\n";
           }
       }
       virtual const char* getClassName()=0;
       static std::vector<Foo*> fooList;
};

std::vector<Foo*> Foo::fooList;

class Bar : public Foo {
    public:
        Bar() {};
    private:
        const char* getClassName()
        {
            return "Bar";
        }
};

int main()
{
    //intentionally leaked
    Foo::fooList.push_back(new Bar());
    Foo::fooList.push_back(new Bar());
    Foo::fooList.push_back(new Bar());

    Foo::printFoos();
}

输出:

Class: Bar
Class: Bar
Class: Bar