c++ - 多态性和非虚派生类方法

标签 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-使用“奇怪的重复模板模式”

我不使用它的原因:

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

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

最佳答案

基类中的函数不应该知道派生类中的函数或它们的行为,除非基类当然需要该功能并且基类作为返回将它们声明为虚拟或纯虚拟。 换句话说,基类不依赖于派生类。执行此操作的代码会产生循环依赖,应不惜一切代价避免这种依赖。

这意味着您应该声明或实现基类中的所有功能。如果实现,让它们返回错误(或抛出异常),以便派生类可以使用适当的实现覆盖它们。

基类中的这些函数将是虚拟 或纯虚拟(首选)。

例子:

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

关于c++ - 多态性和非虚派生类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25842419/

相关文章:

c++ - 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

c++ - 多态性和引用切片

java - Java中的引用变量到底是什么?它与其他变量有何不同?

c++ - 如何声明一个类显式抽象?

c++ - 互斥锁映射c++11

c++ - 如何调试 Excel 对 COM 服务器的加载?

java - JPA/Hibernate - 多态多对一关系设计

从公共(public)基类派生的函数传递和返回 C++ 对象

c++ - 如何在C++中将字符串转换为整数

c++ - 在 macOS 上覆盖 malloc