Подкласс в качестве аргумента в функции-члене суперкласса, C

#c #class #oop #arguments

#c #класс #ооп #аргументы

Вопрос:

Я новичок в ООП и работаю над проектом на C . Я выделил свою проблему, чтобы упростить ответ, но вот реальный сценарий:

У меня есть функция-член суперкласса, которая изменяет значения внутри объекта, который ее вызвал. Модификация основана на значении, поступающем от другого объекта того же класса. Этот объект передается функции в качестве единственного параметра. Например:
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 amp;example) { std::cout << example.getName(); }   
    //subclass as parameter (I'd want the line below to work)   
    //void test2(Derived amp;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;    
}    
  

Каков стандартный способ сделать это?

Ответ №1:

Вы могли бы создать test2 шаблон и убедиться, что он используется только с типами, производными от Base :

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

Вот демонстрация.