C++ - 替换基类方法

Posted

技术标签:

【中文标题】C++ - 替换基类方法【英文标题】:C++ - Replace base class method 【发布时间】:2021-06-23 00:19:00 【问题描述】:

我想调用一个基类方法,如果它被覆盖,则调用被覆盖的方法,否则,调用基类方法。

这个想法是: 我有一个基类虚拟方法,如果满足某些运行时条件,那么我实例化一个完全替换基类方法的派生类方法。现在每次调用基类方法时,都会调用派生方法。

我认为这可以通过修改基类的虚拟方法表并将该表中的方法地址替换为“覆盖”的新函数的地址来完成。

我不知道这是否可以仅使用继承来存档。如果不是,那将是做到这一点的最佳方法? 谢谢。

【问题讨论】:

不要乱用 vtable。您的代码失去了可移植性。即使是对同一个编译器的小幅升级也可能会改变你下面的规则,并导致大量神秘错误。 @user4581301 你甚至可能能够弄乱vtable,没有理由它不能在只读内存中。如果你弄乱了它,它会在该类的所有对象之间共享,所以你会影响它们——可能不是预期的。 【参考方案1】:

你描述的是非纯虚函数是如何工作的。

我想从基类实例中调用方法。

例子:

struct Base 
    virtual void foo()  std::cout << "base"; ;
;

struct Overrides : Base 
    void foo() override  std::cout << "overridden"; ;
;

int main() 
    if (runtime_condition) 
        Overrides o;
        Base& b = o;
        b.foo(); // calls overridden
     else 
        Base b;
        b.foo(); // calls base
    
;

【讨论】:

我想从基类实例调用方法。不是来自派生类。 @FranciscoLinan 我调整了示例以通过基本引用调用函数。是这个意思吗? 这正是我想要的。谢谢。 一个更好的(即更实际的)示例可能类似于:Base *b; if (runtime_condition) b = new Overrides; else b = new Base; ... b-&gt;foo(); /* calls Base::foo() or Overrides::foo() accordingly... */ ... delete b; /* don't forget to make ~Base() virtual ...

以上是关于C++ - 替换基类方法的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 基类指针,方法指针,指派生类,方法?

c++ 在基类类型的向量中调用子类方法

派生自抽象基类并调用另一个类中的方法的 C++ 包装类,该类也派生自抽象基类

C++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法

c++基类对象的std::vector----派生类的运行方法

c++解决二义性的方法