比方说,我们有以下2类重写虚函数 - 派生类有不同的参数
class Base {
public:
virtual ~Base();
virtual void op(string& s1) = 0;
};
class Derived1 : public Base {
public:
virtual void op(string& s1) override;
};
到目前为止,一切都很好。现在,需要一个新的要求,其中需要创建Derived2类的 ,但是该类需要2个字符串 作为op虚拟函数中的参数。当然,如果我在Derived2中添加带有2个字符串作为输入的函数op ,它将被重载而不会被重写。 所以,我必须做这样的事情 -
class Base {
public:
virtual ~Base();
virtual void op(string& s1) {}
virtual void op(string& s1, string& s2) {}
};
class Derived1 : public Base {
public:
virtual void op(string& s1) override;
};
class Derived2 : public Base {
public:
virtual void op(string& s1, string& s2) override;
};
这工作,但我不得不添加第二运算功能的基类。 此外,基类功能现在不是纯虚拟的,这是 必需的,否则派生类将需要实现不必要的 op函数。这对我来说似乎有点不合适。我们需要在Base类中再添加一个 op函数。理想的情况是,基类不应该改变,如果 某人添加了一个新的派生类。
我相信有更好的方法来做到这一点。相当肯定有一个 设计模式,因为这似乎是一个常见问题,并且 必须已经解决。
有什么建议吗?
感谢, Amarnath
但是,如果没有共同的功能,你为什么使用继承所有在Base,Derived1和Derived2之间 – Kapil
它与多态的主要思想相矛盾。基类必须描述所有衍生物的通用接口。 –
op函数是3个类之间的通用功能。派生类的对象被创建并保存在地图中。地图中的值是“Base *”。当某个事件发生时,我们从地图中检索对象并调用base-> op()。这里的基指针可以指向任何派生类。调用base-> op的代码知道我们引用的是哪个派生类,因此知道是否传递1个字符串,2个字符串或其他一组参数。 –