मैं ओओपी के लिए नया हूं और मैं सी ++ प्रोजेक्ट पर काम कर रहा हूं। मैंने उत्तर को आसान बनाने के लिए अपनी समस्या को अलग कर दिया लेकिन यहाँ वास्तविक परिदृश्य है:

मेरे पास एक सुपरक्लास सदस्य फ़ंक्शन है, जो उस ऑब्जेक्ट के अंदर मानों को संशोधित करता है जिसे इसे कहा जाता है। संशोधन उसी वर्ग के किसी अन्य ऑब्जेक्ट से आने वाले मान पर आधारित है। यह ऑब्जेक्ट फ़ंक्शन को एकमात्र पैरामीटर के रूप में दिया जाता है। जैसे:
void BaseClass::function(BaseClass x) {}

हालाँकि, मैंने एक उपवर्ग बनाया। और यदि पैरामीटर एक उपवर्ग प्रकार है, तो मैं इसकी अनूठी विशेषता को भी संशोधित करना चाहता हूं।
void BaseClass::function(DerivedClass x) {}

समस्या यह है कि उपवर्ग को बाद में कोड में स्पष्ट रूप से परिभाषित किया गया है।

मैं इसे दो अलग-अलग तरीकों के रूप में नहीं चाहता, क्योंकि गणना एल्गोरिदम पहले से ही अंदर लिखा गया है, और जो समाधान मैं खोजता हूं उसे उन जगहों पर कोड बदलने की आवश्यकता नहीं है जहां फ़ंक्शन पहले से उपयोग में है। इसके अलावा, हर दूसरी संभावना जो दिमाग में आती है (जैसे typeid() का उपयोग करना) मूर्खतापूर्ण लगती है।

#include <iostream>   
#include <string>   

class Base   
{   
protected:   
    //common attribute   
    const std::string name;   
public:   
    //constructor for common attribute   
    Base(const std::string nameString) : name(nameString) {}   
    //getter   
    std::string getName() { return name; }   
    //superclass as parameter   
    void test1(Base &example) { std::cout << example.getName(); }   
    //subclass as parameter (I'd want the line below to work)   
    //void test2(Derived &example) { std::cout << example.getNumber(); }   
};   
   
class Derived : private Base   
{   
protected:   
    //unique attribute   
    const std::string number;   
public:   
    //constructor   
    Derived(const std::string nameString, const std::string numberString) : Base(nameString),  
  number(numberString) {}
    //getter for unique attribute   
    std::string getNumber() { return number; }    
};    
    
int main ()    
{    
    Base object = Base("whatever");   
    Base baseParameter = Base("base");    
    Derived derivedParameter = Derived("derived", "12");    
    object.test1(baseParameter);    
    //object.test2(derivedParameter);    
    return 0;    
}    

इसे करने का मानक तरीका क्या है?

0
Balázs Tóth 7 अक्टूबर 2020, 21:14

1 उत्तर

सबसे बढ़िया उत्तर

आप test2 को एक टेम्प्लेट बना सकते हैं, और सुनिश्चित कर सकते हैं कि इसका उपयोग केवल Base से प्राप्त प्रकारों के साथ किया जाता है:

template<typename Derived>
void test2(Derived &example) 
{ 
  static_assert(std::is_base_of_v<Base, Derived>);
  std::cout << example.getNumber(); 
}

यह रहा एक डेमो

1
cigien 7 अक्टूबर 2020, 21:43