Note that there are some explanatory texts on larger screens.

plurals
  1. POc++: Inheriting a method with a different (but covariant) return type
    text
    copied! <p>Suppose we have 2 classes:</p> <pre class="lang-cpp prettyprint-override"><code>class DataStructure { public: DataStructure &amp;operator=(const DataStructure &amp;); friend const DataStructure &amp;operator+(int, const DataStructure &amp;); //... }; class Array : public DataStructure { public: Array &amp;operator=(const DataStructure &amp;); friend const Array &amp;operator+(int, const Array &amp;); //... }; </code></pre> <p>and we want <code>Array::operator=</code> and <code>Array</code>'s freind <code>operator+</code> to do the same thing as <code>DataStructure::operator=</code> and <code>DataStructure</code>'s freind <code>operator+</code>, except they should return <code>Array &amp;</code>,<code>const Array &amp;</code> instead of <code>DataStructure &amp;</code>,<code>const DataStructure &amp;</code>. I need to do it with dozens of methods, so is there a simpler way to implement it than the following?</p> <pre class="lang-cpp prettyprint-override"><code>Array &amp;Array::operator=(const DataStructure &amp;other) { return (Array &amp;)DataStructure::operator=(other); } const Array &amp;operator+(int x, const Array &amp;other) { return (const Array &amp;)(x + (DataStructure)other); } </code></pre> <hr/> <p><strong>EDIT:</strong> I came up with another idea, although it's a pretty bad one:</p> <pre class="lang-cpp prettyprint-override"><code>class Array; class DataStructure { public: //... operator Array &amp;() const; }; //... DataStructure::operator Array &amp;() const { return (Array &amp;)*this; } </code></pre> <p>This way <code>DataStructure</code> is implicitly converted to an <code>Array</code> whenever needed, although it still can't handle correctly cases where both <code>DataStructure</code> and <code>Array</code> are legal but do different things, as in this example:</p> <pre class="lang-cpp prettyprint-override"><code>//in class DataStructure: public: friend ostream &amp;operator&lt;&lt;(ostream &amp;os,const DataStructure &amp;) { os &lt;&lt; "DataStructure" &lt;&lt; endl; return os;} //in class Array: public: friend ostream &amp;operator&lt;&lt;(ostream &amp;os,const Array &amp;) { os &lt;&lt; "Array" &lt;&lt; endl; return os;} //... int main() { Array x; cout &lt;&lt; 1 + x &lt;&lt; endl; // output: "DataStructure" instead of "Array" return 0; } </code></pre> <p>Thanks you!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload