【发布时间】:2019-02-07 14:48:29
【问题描述】:
我想知道是否有一种通用的方式/模式可以让派生类在给定的基类中拥有更专业的纯虚方法版本。
class Base {
public:
Base() = default;
virtual ~Base() = 0;
virtual void foo(int bar) = 0;
};
inline Base::~Base() {}
class Derived public Base {
public:
Derived() = default;
~Derived() = default;
void foo(int bar) override {/*...*/}
};
class SpecializedDerived : public Base {
public:
SpecializedDerived() = default;
~SpecializedDerived() = default;
void foo(int bar, double additionalParameter) override {/*...*/}
};
SpecializedDerived 类中的覆盖是不可能的,因为方法的签名与纯虚拟Base 类中的签名不对应。
现在,有没有办法实现所描述的设计?有没有办法实现“更专业的方法”,因为有类继承可以让您实现“更专业的类”?
在打字时,我认为我的愿望更像是一种“伙计,我只是希望你提供某种iterate(.) 功能!”东西。
到目前为止,我想到的唯一想法是
class Base {
public:
Base() = default;
virtual ~Base() = 0;
virtual void foo(int bar) = 0;
};
inline Base::~Base() {}
class SpecializedDerived : public Base {
public:
SpecializedDerived(double addParam) : additionalParam_(addParam) {}
~SpecializedDerived() = default;
void foo(int bar) override {
iterate(bar, additionalParam_);
return;
}
private:
double additionalParam_;
void foo(int bar, double additionalParam) {/*...*/}
};
这个内部函数调用实际上是多余的,你可以这样做:
class SpecializedDerived : public Base {
public:
SpecializedDerived(double addParam) : additionalParam_(addParam) {}
~SpecializedDerived() = default;
void foo(int bar) override {/* code using additionalPara_ */}
private:
double additionalParam_;
};
【问题讨论】:
-
只看到
Base*或Base&的代码将如何调用“更专业”的方法?它如何传递那个额外的参数? -
你的解决方案有什么问题?
-
从技术上讲,您可以在
Base中使用virtual void foo(int bar, double additionalParameter) = 0,在Derived中使用void foo(int bar, double additionalParameter = 0) override。 -
我不明白你的用例。如果应该有一个额外的参数,为什么
Base中没有一个? -
@StoryTeller:你是完全正确的......在
Base* b = new SpecializedDerived();的情况下无法实现这样的事情的一个非常明显的原因@ --- @Christian Hackl:现在你'再问……其实没什么。我只是不想让附加参数成为该类的成员。 --- @PasserBy:在这种情况下,例如它是关于一个抽象基类Iterable,用于计算模拟步骤。Iterable类越专业,它可能需要的参数就越多,我想“强制”用户安装某种iterate(.)方法。
标签: c++ inheritance polymorphism pure-virtual