无法使用 child classes 中定义的虚拟 getter 实现基础 class
Cannot implement base class with virtual getters that are defined in child classes
我有一个叫Object的class,这个class的header是:
class DLL_SPEC Object {
public:
Object();
virtual ~Object();
virtual std::string getString() const;
virtual void setString(std::string value);
virtual int getInt() const;
virtual void setInt(int value);
virtual double getDouble() const;
virtual void setDouble(double value);
virtual bool isType(FieldType type) const;
};
而我的childclass如下:
class DLL_SPEC IntObject : public Object {
public:
IntObject() : value(0) {}
IntObject(int v) : value(v) {}
void setInt(int value) override { this->value = value; };
int getInt() const override { return this->value; };
bool isType(FieldType type) const override;
private:
int value;
};
class DLL_SPEC DoubleObject : public Object {
public:
DoubleObject() : value(0.0) {}
DoubleObject(double v) : value(v) {}
void setDouble(double value) override { this->value = value; };
double getDouble() const override { return this->value; };
bool isType(FieldType type) const override;
private:
double value;
};
class DLL_SPEC StringObject : public Object {
public:
StringObject() : value("") {}
StringObject(std::string v) : value(v) {}
void setString(std::string value) override { this->value = value; };
std::string getString() const override { return value; };
bool isType(FieldType type) const override;
private:
std::string value;
};
现在,问题是,我有一个 Object 数组,我想获得 StringObject.
的字符串表示形式
我调用了 array[0].getString()
,即使 object 是字符串类型 Object,被调用的方法也是基础 class,我明白了。
那么,每当我在基础 class 上调用 getString() 时,我将如何实现它,它会转到相同 object 的 child 之一?
我试过使用这个方法:
std::string Object::getString() const
{
return dynamic_cast<StringObject*>(this).getString();
}
但随后我收到一条错误消息,指出我无法丢弃 const 或任何类型限定符,这是通过删除 const 修饰符(根据任务我必须保留在那里)修复的,但随后我收到另一个消息不存在合适的构造函数。那么我将如何实现这一点并让这个基础 class 使用 child 之一?
编辑:添加了一个小示例,该示例进入 Object class 的 getString 方法,而不是 StringObject class.
int findPersonId(std::string whereName)
{
Db* db = Db::open("database");
Table* people = db->openTable("table");
auto iteratorTable = table->select();
while (iteratorTable->moveNext())
{
for (size_t i = 0; i < table->getFieldCount(); i++)
{
if (table->getFields()[i]->getName() == "id")
{ //this one beneath goes to the base class and not StringObject
std::string foundRow = iteratorPeople->getRow()[i]->getString();
if (foundRow == whereName)
{
return iteratorTable->getRowId();
}
}
}
}
return 0;
}
注:Table*是二维数组,由Object**组成(数组包含StringObject、IntObject、DoubleObject).方法 .getRow() return 由 StringObject ...
组成的 Object** 数组
我启动进入数组的 object 的方式是
Table* table= db->openOrCreateTable("table", 2, userFields); //this creates a 2d array
StringObject* name = new StringObject("Joseph");
IntObject* id = new IntObject(5);
Object** row = combineToRow(id, name);
table->insert(row); //insert an array into 2D array
方法 combineToRow 只是 Object** 的简单转换器。
template<typename A, typename B>
Object** combineToRow(A a, B b) {
return new Object * [2]{ a, b };
}
您还没有为您的 IntObject
实现 getString
方法,并且由于您没有覆盖它,所以您正在调用基本方法。一旦你像这样实现它
class IntObject : public Object {
...
virtual std::string getString() const { return std::to_string(value); };
...
};
那你就可以调用了。
int main(){
StringObject* name = new StringObject("Joseph");
IntObject* id = new IntObject(5);
Object** row = combineToRow(id, name);
std::cout << row[0]->getString() << " " << row[1]->getString();
}
5 Joseph
查看工作版本here
我有一个叫Object的class,这个class的header是:
class DLL_SPEC Object {
public:
Object();
virtual ~Object();
virtual std::string getString() const;
virtual void setString(std::string value);
virtual int getInt() const;
virtual void setInt(int value);
virtual double getDouble() const;
virtual void setDouble(double value);
virtual bool isType(FieldType type) const;
};
而我的childclass如下:
class DLL_SPEC IntObject : public Object {
public:
IntObject() : value(0) {}
IntObject(int v) : value(v) {}
void setInt(int value) override { this->value = value; };
int getInt() const override { return this->value; };
bool isType(FieldType type) const override;
private:
int value;
};
class DLL_SPEC DoubleObject : public Object {
public:
DoubleObject() : value(0.0) {}
DoubleObject(double v) : value(v) {}
void setDouble(double value) override { this->value = value; };
double getDouble() const override { return this->value; };
bool isType(FieldType type) const override;
private:
double value;
};
class DLL_SPEC StringObject : public Object {
public:
StringObject() : value("") {}
StringObject(std::string v) : value(v) {}
void setString(std::string value) override { this->value = value; };
std::string getString() const override { return value; };
bool isType(FieldType type) const override;
private:
std::string value;
};
现在,问题是,我有一个 Object 数组,我想获得 StringObject.
的字符串表示形式我调用了 array[0].getString()
,即使 object 是字符串类型 Object,被调用的方法也是基础 class,我明白了。
那么,每当我在基础 class 上调用 getString() 时,我将如何实现它,它会转到相同 object 的 child 之一?
我试过使用这个方法:
std::string Object::getString() const
{
return dynamic_cast<StringObject*>(this).getString();
}
但随后我收到一条错误消息,指出我无法丢弃 const 或任何类型限定符,这是通过删除 const 修饰符(根据任务我必须保留在那里)修复的,但随后我收到另一个消息不存在合适的构造函数。那么我将如何实现这一点并让这个基础 class 使用 child 之一?
编辑:添加了一个小示例,该示例进入 Object class 的 getString 方法,而不是 StringObject class.
int findPersonId(std::string whereName)
{
Db* db = Db::open("database");
Table* people = db->openTable("table");
auto iteratorTable = table->select();
while (iteratorTable->moveNext())
{
for (size_t i = 0; i < table->getFieldCount(); i++)
{
if (table->getFields()[i]->getName() == "id")
{ //this one beneath goes to the base class and not StringObject
std::string foundRow = iteratorPeople->getRow()[i]->getString();
if (foundRow == whereName)
{
return iteratorTable->getRowId();
}
}
}
}
return 0;
}
注:Table*是二维数组,由Object**组成(数组包含StringObject、IntObject、DoubleObject).方法 .getRow() return 由 StringObject ...
组成的 Object** 数组我启动进入数组的 object 的方式是
Table* table= db->openOrCreateTable("table", 2, userFields); //this creates a 2d array
StringObject* name = new StringObject("Joseph");
IntObject* id = new IntObject(5);
Object** row = combineToRow(id, name);
table->insert(row); //insert an array into 2D array
方法 combineToRow 只是 Object** 的简单转换器。
template<typename A, typename B>
Object** combineToRow(A a, B b) {
return new Object * [2]{ a, b };
}
您还没有为您的 IntObject
实现 getString
方法,并且由于您没有覆盖它,所以您正在调用基本方法。一旦你像这样实现它
class IntObject : public Object {
...
virtual std::string getString() const { return std::to_string(value); };
...
};
那你就可以调用了。
int main(){
StringObject* name = new StringObject("Joseph");
IntObject* id = new IntObject(5);
Object** row = combineToRow(id, name);
std::cout << row[0]->getString() << " " << row[1]->getString();
}
5 Joseph
查看工作版本here