我在获取对象向量以打印派生类的名称而不是基类时遇到问题。
这些是我的课程
#include <vector>
#include <iostream>
using namespace std;
class Object
{
string name;
public:
string getName()
{
return name;
}
};
class Flashlight : public Object
{
string name = "Flashlight";
public:
string getName();
};
这是我的主要内容,它有一个对象的向量,此时只需要打印出他们的名字。
int main()
{
vector<Object> items;
items.push_back(*new Flashlight);
for(int i = 0; i < items.size(); i++)
{
cout << i+1 << " " << items.at(i).getName();
}
}
现在,如果我在Object中为某个名称赋值,它将打印出来但不使用派生类的值,我只是希望它继承该函数,然后使用它自己的值。我已经尝试在基类中实现该函数(但是看到我将来会有很多这样的函数会导致大量的冗余代码)但是这也不起作用。
答案 0 :(得分:3)
不是在派生类中声明变量'name',而是将变量值初始化为该派生类的自定义值。另外我建议你将getName方法设为虚拟方法。如果只想输出名称,也不需要在派生类中覆盖getName方法。
答案 1 :(得分:1)
尝试这种方式:
int main()
{
vector<Object *> items;
items.push_back(new Flashlight);
for(int i = 0; i < items.size(); i++)
{
cout << i+1 << " " << items.at(i)->getName();
}
}
另外在另一个答案中提到,最好使用virtual
方法阅读here.
您还需要使用构造函数来设置变量name
的值。你可以阅读它们here
你应该这样试试:
class Object
{
private:
string name;
public:
Object() : name("Object")
{}
Object(string str) : name(str)
{}
string getName()
{
return name;
}
};
class Flashlight : public Object
{
public:
Flashlight() : Object("Flashlight")
{}
string getName();
};
答案 2 :(得分:1)
您的代码有两个问题:
getName()
不是虚拟的。这意味着调用的实际函数是在编译时根据变量 static 类型决定的。因此,如果您的变量属于Object
,Object&
或Object*
(或其中的任何const
变体),则会调用函数Object::getName()
,而不管变量引用或指向的对象的实际类型(动态类型)。vector<Object>
,这意味着存储在其中的所有对象都是Object
类型。您可以尝试在其中放置Flashlight
对象,但只有Object
部分会被复制到向量中。如果你需要vector<>
中的多态,你需要一个指针向量(甚至更好的智能指针)。因此,您必须做两件事才能获得所需的行为:
getName()
声明为virtual string getName()
(偶数
更好,virtual const string& getName() const
)items
声明为vector<Object*> items
(更好的是,请使用
适当的智能指针,例如unique_ptr<>
而不是原始的
指针)