我有两个类(BaseClass、DerrivedClass),我想在 BaseClass 中创建一个具有未定义数量的参数的虚拟方法。参数的数量(如果有)应在方法的 DerrivedClasses 重写中定义。 BaseClass 定义可以是抽象的,也可以不是,但最好是抽象的。我想要这个的原因是这样我可以强制 BaseClass 的每个子类用它自己的唯一值覆盖定义。
这可能吗,还是只是一厢情愿?
class BaseClass
{
public:
// I want to be able to override this method with as many parameters as the DerrivedClass desires, without having to make a version of it in BaseClass.
virtual AssignValues() = 0;
}
class DerrivedClass : public BaseClass
{
public:
void AssignValues(const std::string& value1, const int value2) override
{
m_value1 = value1;
m_value2 = value2;
};
private:
std::string m_value1;
int m_value2;
}
class DerrivedClass2 : public BaseClass
{
public:
void AssignValues(const int value) override
{
m_value = value;
};
private:
int m_value;
}
主.cpp
DerrivedClass example1;
DerrivedClass2 example2;
example1.AssignValues("Test Name", 1);
example2.AssignValues(2);
您想要实现的目标对我来说似乎是一个设计缺陷,但如果确实需要这样做,您可以获得的最接近的是具有单个多态参数的虚拟成员函数,该函数能够携带所有需要的信息。 在我的第一个示例中,我使用了 std::variant,因此需要预先了解类型。
#include<iostream>
#include <variant>
struct Vals
{
int x{};
char y{};
};
using SetterArgs = std::variant<Vals, double>;
struct Base
{
virtual void setValues(const SetterArgs&) = 0;
virtual ~Base() = default;
};
struct Der1 : Base
{
int val1;
char val2;
void setValues(const SetterArgs& a) override
{
const auto& v = std::get<Vals>(a);
val1 = v.x;
val2 = v.y;
}
};
struct Der2 : Base
{
double val;
void setValues(const SetterArgs& a) override
{
const auto& v = std::get<double>(a);
val = v;
}
};
int main()
{
Der1 d1;
static_cast<Base&>(d1).setValues(Vals{82, 'z'});
std::cout << d1.val1 << ' ' << d1.val2 << '\n';
Der2 d2;
static_cast<Base&>(d2).setValues(3.14);
std::cout << d2.val << '\n';
}
https://godbolt.org/z/eM9eYd8e3
std::any
也可以在这里工作
#include <any>
struct Vals
{
int x{};
char y{};
};
struct Base
{
virtual void setValues(const std::any&) = 0;
virtual ~Base() = default;
};
struct Der1 : Base
{
int val1;
char val2;
void setValues(const std::any& a) override
{
const auto& v = std::any_cast<Vals>(a);
val1 = v.x;
val2 = v.y;
}
};
struct Der2 : Base
{
double val;
void setValues(const std::any& a) override
{
const auto& v = std::any_cast<double>(a);
val = v;
}
};