C++:是“虚拟的”遗传给所有子孙

发布于 2024-10-31 10:11:02 字数 320 浏览 1 评论 0原文

假设以下简单情况(注意virtual的位置)

class A {
    virtual void func();
};

class B : public A {
    void func();
};

class C : public B {
    void func();
};

以下调用将调用B::func()C::func()

B* ptr_b = new C();
ptr_b->func();

Assume the following simple case (notice the location of virtual)

class A {
    virtual void func();
};

class B : public A {
    void func();
};

class C : public B {
    void func();
};

Would the following call call B::func() or C::func()?

B* ptr_b = new C();
ptr_b->func();

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

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

发布评论

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

评论(3

毅然前行 2024-11-07 10:11:02
  1. 您的代码是无效的 C++。类定义中的括号是什么?
  2. 它取决于pointer_to_b_type指向的对象的动态类型。
  3. 如果我明白您真正想问什么,那么“是”。这将调用 C::func:

    <前><代码>C c;
    B* p = &c;
    p->func();

  1. Your code is invalid C++. What are the parentheses in class definition?
  2. It depends on the dynamic type of the object that is pointed to by pointer_to_b_type.
  3. If I understand what you really want to ask, then 'Yes'. This calls C::func:

    C c;
    B* p = &c;
    p->func();
    
—━☆沉默づ 2024-11-07 10:11:02

使用指针和引用的示例。

  • 使用指针

    B *pB = new C();
    pB->func(); //调用C::func()
    
    A *pA = 新 C();
    pA->func(); //调用C::func()
    
  • 使用引用。请注意最后一个调用:最重要的调用。

    <前><代码>C c;
    住宿加早餐旅馆b = c;
    b.func(); //调用C::func()

    //重要 - 使用参考!
    A& a = b;
    a.func(); //调用C::func(),而不是B::func()

在线演示:http://ideone.com/fdpU7

Examples using pointers as well as reference.

  • Using pointer

    B *pB = new C();
    pB->func(); //calls C::func()
    
    A *pA = new C();
    pA->func(); //calls C::func()
    
  • Using reference. Note the last call: the most important call.

    C c;
    B & b = c;
    b.func(); //calls C::func() 
    
    //IMPORTANT - using reference!
    A & a = b;
    a.func(); //calls C::func(), not B::func()
    

Online Demo : http://ideone.com/fdpU7

初吻给了烟 2024-11-07 10:11:02

它调用您所引用的类中的函数。然而,如果它不存在,它会一直向上。

尝试以下代码:

#include <iostream>
using namespace std;

class A {
    public:
    virtual void func() { cout << "Hi from A!" << endl; }
};

class B : public A {
    public:
    void func()  { cout << "Hi from B!" << endl; }
};

class C : public B {
    public:
    void func()  { cout << "Hi from C!" << endl; }
};

int main() {
  B* b_object = new C;
  b_object->func();
  return 0;
}

希望这有帮助

It calls the function in the class that you're referring to. It works it's way up if it doesn't exist, however.

Try the following code:

#include <iostream>
using namespace std;

class A {
    public:
    virtual void func() { cout << "Hi from A!" << endl; }
};

class B : public A {
    public:
    void func()  { cout << "Hi from B!" << endl; }
};

class C : public B {
    public:
    void func()  { cout << "Hi from C!" << endl; }
};

int main() {
  B* b_object = new C;
  b_object->func();
  return 0;
}

Hope this helps

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