【问题标题】:Overriding virtual method in c++在 C++ 中重写虚方法
【发布时间】:2012-02-14 05:58:37
【问题描述】:

我有一个包含很多类的库。我想修改某个类的一个虚拟方法的行为。我试图简化,我所拥有的,这里是:

#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.a 表现得像newA 类型?

【问题讨论】:

  • 检查演员表,也许动态演员表会有所帮助

标签: c++ oop


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2014-12-31
    相关资源
    最近更新 更多