无法使用子类中定义的虚拟 getter 实现基类

萎缩

我有一个叫做 Object 的类,这个类的标题是:

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;
};

我的孩子课程如下:

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;
};

现在,问题是,我有一个对象数组,我想获得一个 StringObject 的字符串表示。

我调用array[0].getString(),即使对象是 StringObject 类型,被调用的方法是基类,这是我理解的。

那么,每当我在基类上调用 getString() 时,我将如何实现它,它会转到 SAME 对象之一的子类?

我试过使用这种方法:

std::string Object::getString() const
{
    return dynamic_cast<StringObject*>(this).getString();
}

但是后来我收到一个错误,指出我不能抛弃 const 或任何类型限定符,这是通过删除 const 修饰符来修复的(我必须根据任务将其保留在那里),但随后我收到另一个错误,指出不存在合适的构造函数. 那么我将如何实现这一点并让这个基类使用子类之一?

编辑:添加了一个进入 Object 类的 getString 方法而不是 StringObject 类的小例子。

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() 返回由 StringObject 组成的 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 };
}
托马斯

您尚未getString为您的实现方法IntObject,并且由于您没有覆盖它,因此您正在调用基本方法。一旦你像这样实现它

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

此处查看工作版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++无法使用从基类继承的getter函数

在类中使用@Getter,枚举等

如何使用setter和getter函数实现线程安全类,而使用setter的频率要比getter高得多

在子类中重写时如何调用私有虚拟基类实现

在子类中使用父类的 getter 和 setter

无法编译实现基类抽象方法的子类

为什么重写的虚拟属性总是指向该属性的基类的getter和setter方法

C#中的基类实现

JS为类的每个属性定义getter

如何在emacs中为Java类实现“生成getter / setter”?

在 Android 应用程序的改造实现中访问 kotlin 类自动生成的 getter 方法

Javascript类中的getter和setter的目的

在Javascript的继承类中声明getter / setter

访问Kotlin类中的字段并忽略getter

Ruby中的类变量的Getter / Setter

没有类的Typescript中的Getter / Setter

Grails:在域类中重写getter方法

Java约定:在类中使用getter / setter?

从派生类中隐藏基类的实现细节

派生类是否在 Typescript 中实现了基类的接口

如何使用自定义类对象正确实现 lateinit 以在 android 中的 onCreate() 中使用,避免“属性 getter 或 setter 预期”错误

使用非虚拟基类函数与派生类未实现虚拟函数之间的区别

为什么对getNoise的调用使用基类实现而不使用子类实现?

GSON 无法使用自定义 getter 反序列化 Kotlin 类

子类未调用Objective-C基类属性自定义Getter

如何动态子类化(或实现)基类(或接口)?

子类getter上的@NotNull影响父类表

使用const-ref getter的const_cast实现引用getter的陷阱

重新定义类,拦截getter方法以修改getter返回值