继承,从base方法调用重载方法

时间:2011-10-18 22:54:26

标签: c++ inheritance

我有两个班级:

class A {
    int get();
    string str();
}

string A::str() {
    return string_with( get() );
}

class B : public A{
    int get();
}

如果我这样做:

A a
B b
b.str()

b将调用A::str()(好)并使用A::get()方法(不好!)。我想,当我调用b.str()时,B::get()会使用str

如何让它发挥作用?

3 个答案:

答案 0 :(得分:3)

让它成为虚拟的。这正是虚拟的目的。

virtual int get();

在A的定义中。并且,为了使代码更易于理解,请在B中执行相同的操作。

顺便说一句,我假设您打算写class B : public A

答案 1 :(得分:2)

在面向对象编程的神奇词汇中,有两种方法可以调用方法:静态动态调度。

在静态分派中,当您执行a.do_it()之类的操作时调用的代码是静态确定的,也就是说,它是根据变量a的类型确定的。

在动态调度中,调用的代码是动态确定的,即根据a引用的对象的类型确定。

当然,C ++支持两者。你如何告诉编译器你想要哪种类型的调度?简单:默认情况下,您有静态分派,除非您将virtual放在方法声明中。

答案 2 :(得分:1)

您可以使用虚拟关键字。然后使用指针

class A
{
public:
    virtual int get() { cout << "A::get()" << endl; return 0;}
    string str()
    {
        cout << "A::str()" << endl;
        get();
        return "";
    }
};

class B : public A
{
public:
    virtual int get() { cout << "B::get()" << endl; return 0; }
};

B * b =新B; B-&GT; STR();

输出: A :: STR() B ::得到()