我有一个基类:
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()?
编辑:忘记继承东西
答案 0 :(得分:0)
bar
似乎没有继承foo
。您需要声明继承:
class bar: public foo { ...
答案 1 :(得分:0)
必须使用fooList
,new
创建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