我有两个类,其中一个继承了另一个:
class baseClass
{
public:
virtual void show();
};
void baseClass::show(){cout << "Base class" << endl;}
class derivedClass
{
public:
void show();
};
void derivedClass::show(){cout << "Derived class" << endl;}
如果我创建一个 derivedClass 对象并调用 show 函数,它会正确打印“Derived class”。如果我执行以下操作:
derivedClass b;
baseClass* b;
b=&d;
b->show();
它再次正确打印出“派生类”。 但是,如果我列一个这样的列表:
list<baseClass> t;
list<baseClass>::iterator it;
baseClass b;
derivedClass d;
t.push_back(b);
t.push_back(d);
并尝试在每个项目上调用 show:
it = t.begin();
it->show();
it++;
it->show();
b 和 d 的输出都是“基类”。 我的问题是:为什么它只使用 show() 的 baseClass 版本,我怎样才能让它正确地使用列表中 derivedClass 对象的派生版本?
提前致谢
最佳答案
您必须将方法 show()
声明为 virtual
才能使多态性起作用:
class baseClass
{
public:
virtual void show();
};
void baseClass::show(){cout << "Base class" << endl;}
class derivedClass : public baseClass
{
public:
virtual void show();
};
void derivedClass::show(){cout << "Derived class" << endl;}
您还缺少 class derivedClass : public baseClass
。
最后一个问题。您需要使用指针。
list<baseClass*> t;
list<baseClass*>::iterator it;
baseClass b;
derivedClass d;
t.push_back(&b);
t.push_back(&d);
并更改为:
it = t.begin();
(*it)->show();
it++;
(*it)->show();
关于c++ - 使用列表对象内部对象的派生函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7459253/