正在重写c++中的虚拟方法

Overriding virtual method in c++

本文关键字:虚拟 方法 c++ 重写      更新时间:2023-10-16

我有一个库,里面有很多类。我想修改某个类的一个虚拟方法的行为。我试着简化,我得到了什么,现在是:

#include <iostream>  
using namespace std;  
class B;  
class A  {  
  public:  
    A(B& b_) : b(b_) {};
    B& b;  
    virtual void printon() {
        cout << "Test virtual printon An" << endl;
    }
    void print() {
        cout << "Test print An";
        printon();
    }  
};   
class B  {  
  protected:  
    A a;  
  public:  
    B() : a(*this) {};
    void print() {
        a.print();
    };  
};  

在我的程序中,我可以像这样使用它:

int main()   {  
    B* b = new B();  
    b->print();  
    return 0;  
}  

实际上,方法a.printon()是从一些其他代码和不同的条件调用的,并且不打印任何内容(它执行一些其他操作)。我需要重写这个方法来做其他事情,例如打印"test2"。

我可以创建一个派生类newA:

class newA : public A {  
  public:  
    newA(B& b_) : A(b_) {};
    virtual void printon() {
        cout << "Test printon newA"<< endl;
    }
};  

我不确定下一步该怎么办。也许创建一个类newB,比如:

class newB : public B {
  public:
    newB() : B() {};  
};  

但是如何使A型的B.a表现得像newA型呢?

B按值包含A,这排除了多态性的使用(如果您试图将newA设置到A对象中,则会得到对象切片。如果您希望B能够使用A的派生版本,则需要通过(智能)指针存储它。