关于这个话题有很多问题,但是,我没有找到我下面问题的解决方案。
我有以下几个类
1) 纯虚拟类
class Employee {
private:
vector<Employee> vec_employee;
public:
Employee() {};
virtual ~Employee() {};
virtual void set_vec_subordinate(vector<Employee> vec_employee) = 0;
};
2)派生类
class Worker : Employee{ private: public: };
3)另一个派生类,应该覆盖Employee中的纯虚拟方法。
class Manager : Employee {
private:
public:
inline void set_vec_subordinate(vector<Worker> vec_employee) override { this->set_vec_subordinate(vec_employee); };
};
我试图实现的是覆盖纯虚拟方法,但使用一个 "不同 "的参数。所以对C++还是新手,但我认为应该有一种方法可以做到这一点,特别是因为 另一个参数来自Worker类型,它是Employee的派生类。.
有没有办法做到 恰恰 你打算做什么(这是有充分理由的)。
你的代码也有内在的缺陷,因为你使用了类型的 vector<Employee>
的对象,它需要类型为 Employee
- 不可能存在的 Employee
是一个抽象类。您可能希望使用一个 vector
的引用类型,例如,用 vector<shared_ptr<Employee>>
代替。(本答案的其余部分掩盖了这一事实,使其更易读。)
还请注意 void Manager::set_vec_subordinate(vector<Worker> vec_employee) override { this->set_vec_subordinate(vec_employee); };
会导致无限循环(可能会导致堆栈溢出),因为它将一直调用自己。
类中的 Employee
与用户签订了合同,规定以下代码必须有效(假设给定的 get_boss
和 get_workers
函数)。)
Employee& boss = get_boss();
vector<Employee> subordinate_vec = get_workers();
boss.set_vec_subordinate(subordinate_vec);
现在,这可能对你的应用程序没有任何语义上的意义, 但编程语言的语法意味着,这 必定. 一些编程语言(而不是C++!)允许类似这样的共变调用。
Employee& boss = get_boss();
vector<Worker> subordinate_vec = get_workers();
boss.set_vec_subordinate(subordinate_vec); // Invalid C++: `vector<Worker` cannot be converted to `vector<Employee>` implicitly
虽然确实可以在C++中创建一个容器,其行为方式可以使这种使用成为可能,但更容易处理的是通过使 set_vec_subordinate
函数一个模板,它需要一个任意容器的对象,这些对象是隐式转换或派生的。Employee
- 然后只是在复制操作中转换对象(因为在这种情况下,矢量是不可移动的)。
第二个想法是,当覆盖一个函数时,应该可以改变它的签名。这在C++中是可以实现的,通过实现基例(它需要与二进制兼容--也就是等于--的签名)。Employee
版本,因为在这种情况下它也会被调用),然后添加额外的重载。例如,你可以做一些类似这样的事情。
class Manager : Employee {
private:
public:
inline void set_vec_subordinate(vector<Employee> vec_employee) override { this->vec_employee = std::move(vec_employee); };
inline void set_vec_subordinate(vector<Worker> const& vec_worker) {
vec_employee = std::vector<Employee>(vec_worker.begin(), vec_worker.end()); // copy convert all elements
};
};