多态和非虚拟派生类方法

时间:2014-09-15 06:59:53

标签: c++ polymorphism

请考虑以下代码:

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 - 使用'奇怪的重复模板模式'

我不使用它的原因:

我不知道。也许我对这个模式的使用有误,但我认为我无法创建一个全局指针来实例化我的派生类,因为基类是一个模板,它需要在编译时知道类型。

是否还有其他程序结构可以实现我想要实现的目标?

1 个答案:

答案 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();
}