问一个关于C++问题,对于实例化一个类的所有对象,这些对象有各自的地址(指向成员变量),但是共享一
问一个关于C++问题,对于实例化一个类的所有对象,这些对象有各自的地址(指向成员变量),但是共享一份成员函数地址。但是对于一个子类,它从父类继承的成员函数,是在父类成员函...
问一个关于C++问题,对于实例化一个类的所有对象,这些对象有各自的地址(指向成员变量),但是共享一份成员函数地址。但是对于一个子类,它从父类继承的成员函数,是在父类成员函数空间,还是在子类的成员函数空间(从父类复制过来)?我一直搞不懂,子类是怎么寻找到父类的成员函数的,希望大神能帮我解答下,谢谢。
展开
1个回答
展开全部
Visual Studio调试看见过_vfptr之类的东西吗,就是那个
举个例子
class Base {
public:
virtual void f1();
virtual void f2();
void f3();
//...
};
class Derived : public Base {
public:
virtual void f1() override;
virtual void f4();
void f5();
//...
};
Base *base = new Base(), *derived = new Derived();
Base的vfptr里有Base::f1(), Base::f2()的实现
Derived的vfptr里有Derived::f1(), Base::f2(), Derived::f4()的实现
所以说子类继承的成员函数没有复制,而是和父类共用
derived->f1()相当于在Derived::_vfptr里找到f1的实现,然后调用
非virtual的成员函数调用更简单,直接从父类函数里找
更多追问追答
追问
我知道你说的是虚函数表,我的问题是derived是怎么调用父类f3的,f3存在哪?
追答
直接调用Base::f3()
在在父类成员函数空间
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询