用不同的派生类型参数覆盖纯虚拟函数。

问题描述 投票:1回答:1

关于这个话题有很多问题,但是,我没有找到我下面问题的解决方案。

我有以下几个类

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的派生类。.

c++ overriding derived
1个回答
0
投票

有没有办法做到 恰恰 你打算做什么(这是有充分理由的)。

你的代码也有内在的缺陷,因为你使用了类型的 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_bossget_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
    };
};
© www.soinside.com 2019 - 2024. All rights reserved.