【问题标题】:Suppressing the virtuality of a C++ function in a class hierarchy抑制类层次结构中 C++ 函数的虚拟性
【发布时间】:2022-11-17 03:14:18
【问题描述】:

这纯粹是一个理论问题。我没有考虑特定的用例。

C++ 函数的虚拟性是否可以在类层次结构中的某个地方被抑制,或者一旦在基类中定义了一个虚拟函数,它在类层次结构的其余部分仍然是虚拟的?

我写了一些示例代码,试图抑制在类层次结构中定义的方法的虚拟性,但我没有成功。我的示例代码如下:

class Base {
public:
  virtual void myFunc() {
    std::cout << "myFunc in Base" << std::endl;
  }
};
 
class Child : public Base {
public:
  void myFunc() {
  std::cout << "myFunc in Child" << std::endl;
  }
};
 
class GrandChild : public Child {
public:
  void myFunc() {
  std::cout << "myFunc in GrandChild" << std::endl;
  }
};



int main() {
  Base* ptr = new GrandChild();
  ptr->myFunc();
  return 0;
}

输出如下:

myFunc in GrandChild

【问题讨论】:

  • 一旦使用virtual就无法回头
  • 编号(此空格有意留空)
  • 不 - 类似于你不能删除一个成员变量,因为这样就不会满足 is-a 关系 - 但你试图解决的问题是什么(即使它是理论上的)?
  • 可能是 XY 问题?当使用继承的唯一真正原因是虚函数调度时,为什么要抑制它?
  • 松散相关:您可以有一个模板库来指定您是否希望函数是虚拟的。

标签: c++


【解决方案1】:

您可以做的一件事是创建一个具有不同签名的成员(甚至使用默认参数)。

那是:

struct Base
{
    virtual void foo()
    {
        std::cout << "Base::foo" << std::endl;
    }
};
struct Derived : Base
{
    void foo(int = 0)
    {
        std::cout << "Derived::foo" << std::endl;
    }
};
...
Base * ptr = new Derived;
ptr->foo(); // will invoke Base::foo()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多