C - 由基类指向的更改对象(在操作员oveloading函数中返回引用基类)



我有一个抽象类

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中,以便在主函数中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;
}

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

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

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

no。如果您需要根据覆盖的活动动态更改类型,则需要通过返回值对其进行处理。因此,诸如ptr = --(*ptr)之类的东西,尽管我不建议保留--语法,因为它不会遵循该操作员的标准,因此会感到困惑。

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

c 允许套管可以基础类,并且要谨慎地衍生出。C 不允许在派生兄弟姐妹之间施放。

最新更新