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

inheritance, calling overloaded method from base method

本文关键字:方法 调用 重载 继承      更新时间:2023-10-16

我有两个类:

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使用。

如何让它工作?

让它成为虚拟的。这正是virtual的作用。

virtual int get();
在A的定义中

。并且,为了使代码更容易理解,在B中也这样做。

顺便说一下,我假设你的意思是写class B : public A

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

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

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

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

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

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 = new B;b -> str ();

输出:答::str ()B: get ()