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

发布于 2024-12-10 15:48:25 字数 427 浏览 0 评论 0原文

我有两个类:

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

如何让它发挥作用?

I have two classes:

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

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

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

if I do:

A a
B b
b.str()

b will invoke A::str() (good) and it ill use A::get() method (bad!). I want, that when I invoke b.str(), the B::get() is used by str.

How to make it work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

゛时过境迁 2024-12-17 15:48:25

就让它虚拟吧。这正是虚拟的用途。

写出

virtual int get();

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

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

Just make it virtual. That's exactly what virtual is for.

Write

virtual int get();

in A's definition. And, just to make the code more understandable, do the same in B's.

By the way, I'm assuming that you meant to write class B : public A.

顾冷 2024-12-17 15:48:25

在面向对象编程的神奇术语中,有两种调用方法的方式:静态动态分派。

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

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

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

In the magical word of Object-Oriented programming, there are two ways of calling a method: static and dynamic dispatch.

In static dispatch, the code called when you do something like a.do_it() is determined statically, that is, it is determined upon the type of the variable a.

In dynamic dispatch, the code called is determined dynamically, i.e., it is determined upon the type of the object referenced by a.

C++, of course, supports both. How do you tell the compiler which type of dispatch do you want? Simple: by default you have static dispatch, unless you put the virtual in the method declaration.

秋心╮凉 2024-12-17 15:48:25

您可以使用 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::获取()

You can use virtual keyword. and then use pointer

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();

the output:
A::str()
B::get()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文