覆盖c ++中的虚方法

时间:2012-02-14 05:58:38

标签: c++ oop

我有一个包含很多课程的图书馆。我想修改某个类的一个虚方法的行为。我试图简化,我已经得到了,这里是:

#include <iostream>  

using namespace std;  

class B;  

class A  {  
  public:  
    A(B& b_) : b(b_) {};

    B& b;  

    virtual void printon() {
        cout << "Test virtual printon A\n" << endl;
    }
    void print() {
        cout << "Test print A\n";
        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()是从其他一些代码和不同条件调用的,并且不会打印任何内容(它会执行其他一些操作)。我需要覆盖此方法以执行其他操作,例如print“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() {};  
};  

但如何使B.a类型的AnewA类型相同?

1 个答案:

答案 0 :(得分:2)

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