#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();
}
Вот демонстрация.