请考虑以下代码:
class Human
{
virtual void Walk() = 0;
}
class Male : public Human
{
void Walk();
}
class Female : public Human
{
void Walk();
Human* GiveBirth();
}
int main()
{
vector<Human*> people;
people.push_back(new Female);
}
假设我想从基类指针调用GiveBirth(),我会有以下选项:
1 - 将指针强制转换为派生类型
people.push_back( dynamic_cast<Female*>(people[0])->GiveBirth() );
我不使用它的原因:
我需要以一种方式创建我的程序,使得所有派生类都不为用户/程序员所知(即使这样的方法与女性相关也是合乎逻辑的。)
2 - 让GiveBirth()方法虚拟
我不使用它的原因:
这个方法现在对于Male类是可见的,这是一切都是合乎逻辑的。
3 - 使用'奇怪的重复模板模式'
我不使用它的原因:
我不知道。也许我对这个模式的使用有误,但我认为我无法创建一个全局指针来实例化我的派生类,因为基类是一个模板,它需要在编译时知道类型。
是否还有其他程序结构可以实现我想要实现的目标?
答案 0 :(得分:0)
基类中的函数不应该知道它们的派生类中的函数或它们的行为,除非基类需要该函数,而基类的返回将它们声明为虚拟或纯虚拟。 换句话说,基类并不依赖于派生类。执行此操作的代码会创建循环依赖,应该不惜一切代价避免。
这意味着您应该声明或实现基类中的所有函数。如果实现了,让它们返回错误(或抛出异常),以便派生类可以通过适当的实现覆盖它们。
基类中的这些函数将是virtual
或纯虚拟(首选)。
示例:
class Human
{
virtual void Walk() = 0;
Human* GiveBirth() = 0;
}
class Male : public Human
{
void Walk();
Human* GiveBirth() { return NULL; }
}
class Female : public Human
{
void Walk();
Human* GiveBirth();
}