【发布时间】:2018-08-23 16:33:28
【问题描述】:
有没有办法强制在子类中实现方法每个派生类的实现会有不同的签名?
我知道我可以做到这一点,使用纯虚拟:
class Base {
public:
virtual void getValue(string& s) = 0;
}
class Derived : public Base {
public:
void getValue(string& s);
}
上面,基类中的纯虚getValue强制派生类实现getValue。但我真正想做的是这样的:强制每个派生类实现 getValue() 但每个都有不同的签名:
class Base {
public:
void getValue() = 0;
}
class Derived_A : public Base {
public:
void getValue(string& s);
}
class Derived_B : public Base {
public:
void getValue(int *j);
}
上面的问题是,由于名称修改,每个签名实际上是一个不同的函数,因此 Derived_A 和 Derived_B 继承 getValue() = 0 并且编译器认为它们也是抽象的。
我一直在尝试一些不同的方法来做到这一点,但在我看来没有办法做到这一点。我在想我应该不在基类中声明 getValue,然后确保每个派生类都实现它们的版本。
【问题讨论】:
-
看看模板、mixin 和 CRTP,这些将打开一个超越动态多态性的可能性的整个世界。像
void getValue() = 0;这样的东西绝对是零意义顺便说一句。 -
@R Sahu- 感谢您纠正我的错字!
-
@πάντα ῥεῖ -- 谢谢。现在阅读 CRTP。看起来这可能正是我在这种情况下所需要的。
-
回复:“我不应该在基类中声明 getValue”——也许吧。您在这里谈论的是编写代码;根本问题是设计问题之一。你想做什么?为什么在派生类中需要不同的签名,这些函数与基类中声明的函数有什么联系(如果有)?
-
@DanielGoldfarb 想象一下这可能你会如何使用这个功能,你想过吗?
标签: c++ abstract-class