【问题标题】:Abstract class inheriting another abstract class with the same function name抽象类继承另一个具有相同函数名的抽象类
【发布时间】:2013-01-03 15:53:24
【问题描述】:
 class subscriber
 {
 public:
      virtual void update() = 0;
 }

 class entity : public subsriber
 {
 public:
      virtual void update() = 0;
 }

 class myObject : public entity
 {
 public:
      virtual void update()
       {
        do_things();
       }
 }

 subscriber * ptr = new myObject; //will use shared_ptr, but here i want simplicity

  ptr->update(); 

问题是,会调用正确的更新函数(myObject 中实现的那个)吗?一个“家族”中有两个同名的纯虚函数是否有效?

【问题讨论】:

  • 您究竟为什么要这样做?当然,只有一种抽象方法可以解决问题。
  • @Antonie Blom 我有发布/订阅模式,每个实体都是订阅者。有 2 个函数,因为从存储已发布消息(如果有任何新消息)的对象调用更新(使用订阅者 *)和从实体管理器调用更新(使用实体 *)。
  • 用编译器检查行为时发生了什么?在你的编译器上检查这个行为应该很容易,不是吗?
  • @Alok Save 我现在无法访问编译器,我在嵌入式设备上。我现在只是在设计并检查它是否有效。
  • @user1873947: Now you do

标签: c++ class inheritance virtual abstract


【解决方案1】:

会调用正确的更新函数(myObject 中实现的那个)吗?

是的,它会被调用。

在一个“家族”中有两个同名的纯虚函数有效吗?

第二个声明(即在entity 类中)没有将第二个纯虚函数引入该族:签名是相同的,因此update() 是单个虚函数。此外,不需要第二次声明它:entity 将保持抽象,即使您删除了第二次声明,也可以访问 update() 方法。

【讨论】:

  • 这个答案很好,直到不必要的 只有一个 vtable 插槽保留给它,即使它出现在两个地方。 弹出?您不需要它来解释只有一个函数被覆盖的 OP,对吗?
  • @AlokSave 我可以选择任何一种方式。对我来说,使用 vtable 更容易可视化虚函数发生的情况,但我同意每个人可能都不一样。
  • 从技术上讲,可能没有 vtable 开头:) 因此我反对。
  • @AlokSave 是的,我知道:C++ 标准没有谈论虚函数的 vitables,调用堆栈变量“具有自动存储持续时间的变量”等等,以避免单独列出特定的实现。然而,无论你看哪里,似乎总是有一个用于自动变量的堆栈和一个用于虚函数的 vtable ;-)
  • Re 而且,第二次声明它是没有必要的 -- 如果您使用的是不完全理解该语言的第三方工具,这可能是必要的。当我需要这样做时,我倾向于在 entity::update 的声明前加上 // #@$% SWIG 之类的注释作为纯虚拟的前缀。
【解决方案2】:

虚函数或虚方法是一种函数或方法,其行为可以在继承类中被具有相同签名的函数覆盖。

所以答案是是的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多