【问题标题】:Override a non-virtual method in C++覆盖 C++ 中的非虚拟方法
【发布时间】:2018-01-28 16:59:54
【问题描述】:

我有一个类A 和一个继承自A 的类BA 有一个 foo 方法,我想在 B 中覆盖它。

class A {
public:
    void foo();
    ...
}

class B: public A {
public:
    void foo();
    ...
}

解决方案当然是将A::foo() 定义为虚拟方法,将其声明为virtual void foo();。但问题是我不能这样做,因为A 类是在第三方库中定义的,所以我宁愿不更改它的代码。

经过一番搜索,我找到了override 关键字(因此B::foo 的声明将是void foo() override;),但这对我没有帮助,因为that's not what override is foroverride 显然只能使用在虚拟方法上,以确保该方法确实覆盖了另一个方法并且程序员没有犯错,如果该方法不是虚拟的,则会生成错误。

我的问题是如何在不更改A 的任何代码而只更改B 的代码的情况下实现与使A::foo 虚拟化相同的效果?

【问题讨论】:

  • 如果基类不是为支持虚拟调度而设计的,那么基本上你不能,不改变类 - 具体来说,它最好有一个虚拟析构函数。
  • 简短的回答是:你不能。 C++ 不能以这种方式工作。
  • @NeilButterworth 我打算在B::foo 中添加A::foo();,以便B::foo 调用A::foo 以及我需要的其他一些东西,所以我想要do 不应该真正改变基类的行为方式。
  • @Donald 好吧,这听起来可行,但它不会覆盖任何东西。
  • “覆盖”意味着当您有一个指向基类型的指针或引用并调用基类的函数时,调用将转到派生类中定义的函数的版本。如果这是您想要做的,您必须将基类函数声明为virtual。如果您想做其他事情,那么您并没有压倒一切,您需要说出您想做的事情。

标签: c++ inheritance methods overriding virtual-functions


【解决方案1】:

有点晚了。但是你可以根据具体类型使用 std::variant 和委托方法给 A 和 B 两个类。

如果您的编译器不是最新的,请改用标记联合。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2011-05-21
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多