C ++ - 更改基类指向的对象(在操作符开发函数中返回对基类的引用)

时间:2016-11-30 21:08:16

标签: c++

我有一个抽象类

class Abs{
    //...
    public:
    virtual Abs& operator--() = 0;
    virtual void print() = 0;
};

和两个子类

class Sub1: public Abs{
    //...
    public:
    Abs& operator--() {return *this} //this is just to prevent
                     //Sub1 to become an abstract class
    void print() {cout<<"Sub1"<<endl;}      
};

class Sub2: public Abs{
    //...
    public:
    Abs& operator--() {...}          //here is an issue
    void print() {cout<<"Sub2"<<endl;}
};

是否有可能在Sub2中重载operator--以便在main函数ptr中指向Sub1类型的对象?

int main()
{
    Abs* ptr;
    Sub2 sub2;
    ptr=&sub2;

    ptr->print(); //this should print "Sub2"

    --(*ptr);

    ptr->print(); //this should print "Sub1"

    return 0;
}

3 个答案:

答案 0 :(得分:0)

没有。如果需要根据覆盖的活动动态更改类型,则需要通过返回值对其进行处理。像 Promise.resolve({one: 1}) .then(resp.json.bind(resp)) 之类的东西,虽然我不建议保留ptr = --(*ptr)语法,因为它不符合该运算符的标准,因此会令人困惑。

答案 1 :(得分:0)

首先,您的要求很尴尬,真正的答案是:重新考虑您尝试做的事情。

您基本上要求的是成员函数更改this以使其指向另一个对象(因为您无法更改对象的类型)的方法。这是不可能的。

稍微合理的解决方案是避免直接使用多态,并使尖头对象包含指向Sub1Sub2的字段。然后,让指针对象直接调用该字段。这样,您可以更改您使用的有效类型,而不会遇到语言限制。请注意,当然,指向的对象不是Abs,而是其他类型。

答案 2 :(得分:0)

不,这根本不可能。在您的示例中,您甚至没有Sub1类的任何实例。

C ++允许使用大写基类,并对派生类有一些警告。 C ++不允许在派生兄弟之间进行转换。