繁体   English   中英

类成员函数内的虚拟函数调用

[英]virtual function call within a class member function

我了解虚函数和vtable的基本概念,但是在以下示例中,我不明白为什么使用cA(); 打印出来

parent A
child

但没有Parent :: func()的虚拟关键字,它将输出

parent A
parent

您能详细告诉我原因吗? 用v表,内存(堆,堆栈)等进行解释将非常有用。

谢谢。

#include <iostream> 

template <class TYPE> class Parent
{
public:
    Parent() {};
    ~Parent() {};
    virtual void func() { std::cout << "parent" << std::endl; };

    void A() {
        std::cout << "parent A" << std::endl;
        func();
    }

};

template <class TYPE> class Child : public Parent <TYPE>
{
public:
    Child() {};
    ~Child() {};

    void func() { std::cout << "child" << std::endl; };
};

void main()
{
    Child<int> c;
    c.A();
}

虚拟关键字指定可以在派生类中重新定义函数,同时通过引用保留其调用属性。 这基本上是多态行为的触发器。 如果将函数声明为虚拟函数,并且在派生类中对其进行了重新定义,则除非指定了特定的名称空间,否则将使用vtable选择函数的适当版本。 例如Parent :: func()。 尽管名称相同,但没有关键字virtual,您命名为func()的两个函数完全不同。 对于可访问派生类的功能版本的基类,没有可用的引用。 它使用它知道的唯一版本func(),这是基类中定义的版本。

@Pemdas提供了一个很好的解释。 这是我的尝试。

cA()告诉编译器“我将调用父类中定义的非虚函数A”。 转换为Parent::A(&c)

Parent类中的A方法转换为“获取对象&c的vtable,获取第一行中的函数指针,然后调用它”。 由于c重新实现了函数func ,所以函数指针将是c对函数func的实现。 那就是你所看到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM