2012-02-14 81 views
0

我有一个类库很多。我想修改某个类的一个虚拟方法的行为。我试图简化,我有什么,那就是:在C++中重载虚拟方法

#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()从一些其他的代码调用,不同的条件,并不打印任何东西(它做了一些其他的行为)。我需要重写此方法来执行其他操作,例如,打印“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.anewA类型?

+0

退房铸造,说不定动态转换可以帮助 – 2012-02-14 08:37:55

回答

2

B包含A的价值,这就排除了使用多态的(如果你试图将一个newA设置成A对象,你会得到对象切片。如果你希望你的B能够使用的A衍生版本,你” ð需要通过(智能)指针将其保存。

+1

http://stackoverflow.com/questions/2432683/what-does-slicing-mean-in-c – Arafangion 2012-02-14 06:56:51

+0

谢谢,我试着学习,为什么它是按价值存储的。 – 2012-02-14 07:39:52