我有一个抽象类
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;
}
答案 0 :(得分:0)
没有。如果需要根据覆盖的活动动态更改类型,则需要通过返回值对其进行处理。像 Promise.resolve({one: 1})
.then(resp.json.bind(resp))
之类的东西,虽然我不建议保留ptr = --(*ptr)
语法,因为它不符合该运算符的标准,因此会令人困惑。
答案 1 :(得分:0)
首先,您的要求很尴尬,真正的答案是:重新考虑您尝试做的事情。
您基本上要求的是成员函数更改this
以使其指向另一个对象(因为您无法更改对象的类型)的方法。这是不可能的。
稍微合理的解决方案是避免直接使用多态,并使尖头对象包含指向Sub1
或Sub2
的字段。然后,让指针对象直接调用该字段。这样,您可以更改您使用的有效类型,而不会遇到语言限制。请注意,当然,指向的对象不是Abs
,而是其他类型。
答案 2 :(得分:0)
不,这根本不可能。在您的示例中,您甚至没有Sub1
类的任何实例。
C ++允许使用大写基类,并对派生类有一些警告。 C ++不允许在派生兄弟之间进行转换。