【发布时间】:2019-03-07 09:22:00
【问题描述】:
我正在编写一个使用策略的项目,但是,我的派生类具有基类不应该具有的其他附加功能。
class Base {
public:
virtual void execute() = 0;
virtual void print() const noexcept = 0;
virtual ~Base() {}
};
class DerivedA : public virtual Base {
public:
void execute() override;
void print() const noexcept override;
void doSomething();
private:
int x;
double y;
};
class DerivedB final : public Base {
public:
void execute() override;
void print() const noexcept override;
std::string getZ() const noexcept;
private:
std::string z;
};
在 main() 中,我尝试使用 dynamic_cast 来使用这样的附加功能:
int main() {
DerivedA da;
Base* base = &da;
DerivedA* derivedA = dynamic_cast<DerivedA*>(base);
derivedA.doSomething();
return 0;
}
但是当我尝试运行代码时,出现以下错误:
“DerivedA *”与“DerivedA”的间接级别不同
我的问题是,我应该为此使用策略,还是应该使用另一种设计模式?如果我应该使用策略,我该如何解决这个错误?
更新
我正在考虑改用装饰器,因为 DerivedA 可以是 DerivedB 的基类,但是,我担心强制转换,因为每个类都有不同的类成员。
更新
好像我写错了。但是,我在这里发布时写对了!它现在有效,但是,我同意有更好的方法来实现它。
【问题讨论】:
-
派生A->doSomething()
-
我也是这么想的。当我尝试这样做时,我收到警告 表达式必须具有指针类型
-
关于您的更新:在您当前的示例中,
DerivedA不是DerivedB的超类。如果它是DerivedB,将继承它所有基类的成员,包括DerivedA。 -
并不是因为一开始我认为执行策略会更好。但是,我正在审查我的设计,并认为我应该更改它并实现装饰器。
标签: c++ algorithm design-patterns