C++关于非虚构函数调用虚构函数的问题
时间: 2019-04-02来源:博客园
前景提要
C++关于非虚构函数调用虚构函数的问题
0 悬赏园豆: 200 [待解决问题] include <iostream>
using namespace std;
class A{
public:
A(){//A的构造函数,调用了虚构函数func
func();
}
void f(){//A的成员函数f,同样调用了虚构函数func
func();
}
virtual void func(){//虚构函数func,主要作用是输出A
cout << "A" << endl;
}
};
class B:public A{//B继承A
public:
B(){}//B的构造函数
void f(){//B的成员函数f,调用了虚构函数func
func();
}
virtual void func(){//虚构函数func,输出B
cout << "B" << endl;
}
};
int main(){
B b;
/ 定义B类对象,因为B继承自A,因此会首先调用A的默认构造函数。
//而A的构造函数中调用了虚函数func,会不会产生多态效果?结果却却不会
//这里输出: A
/
cout << "..........................................." << endl; b.f();//b调用b的f函数,输出 "B" b.A::f(); //b调用A的f函数(这里f函数不是虚函数,但是它调用了虚函数func),输出 "B" //同样是同A的构造函数一样,同样是调用虚构函数,为啥输出不同? //这里输出 "B" cout << "..........................................." << endl; A *pa = &b; pa->f();//输出 "B" pa->func(); //输出 "B" cout << "..........................................." << endl; return 0;
} 木子苍苍 | 初学一级 | 园豆: 2
提问于:2019-04-02 16:02 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(2) 0 个人认为多态效应是在对象完整性情况下才会产生的,也就是对象实例已经构造完成。
创建派生类对象的时候,是先构造出基类的部分,然后再构造派生类的部分,当在基类构造函数里调用虚函数的时候,派生类尚未构造完成,其虚函数也没构造出来,也就是还没有这个函数。所以肯定是调用基类的虚函数 beautifulday | 园豆:190 (初学一级) | 2019-04-02 16:11 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 在调用构造函数中调用虚函数,编译器认为其类型是确定的,因此没有使用虚函数表,而是直接使用了函数地址。这点反汇编一下就能看出来。
构造完成后,虚函数表已经更新,因此这之后调用B类型的func()才是输出"B"。 一罪 | 园豆:245 (菜鸟二级) | 2019-04-02 21:26 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行