[英]How to call a virtual function from within a derived class function
[英]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.