BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #84566同步于 2014/12/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教一下c++多态(动态绑定)问题

zxybupt
2014/12/3镜像同步6 回复
Base类 #ifndef BASE_H #define BASE_H #include<iostream> class Base{ public: Base(int i):val(i){} virtual void print(){std::cout<<val<<std::endl;} //代号一 //void print(){std::cout<<val<<std::endl;} 代号二 private: int val; }; #endif D1类: #ifndef D1_H #define D1_H #include"Base.h" class D1:public Base{ public: D1(int i,int j):Base(i),v1(j){ } void print(){Base::print();std::cout<<v1<<std::endl;} private: int v1; }; #endif 主函数: #include"Base.h" #include"D1.h" #include<vector> #include<memory> using namespace std; int main() { vector<shared_ptr<Base>> b; b.push_back(make_shared<Base>(1)); b.push_back(make_shared<D1>(2,3)); for(auto i:b) { i->print(); } system("pause"); } 使用VS2012 代号一时输出:1 2 3 代号二时输出:1 2 代号一是动态绑定,这个我明白。我的疑问是代号二,auto b的第二个对象保存的静态类型是Base,动态类型是D1。原理上首先在静态类型Base寻找print符号,正好在Base类找到,然后停止寻找进行类型检查(类型检查正确),又因为不是动态绑定,所以可以调用Base中的print(),此时为什么Base的val是2?派生类D1在初始化时把基类部分Base的val初始化为2,但是我感觉我们单纯的调用Base::print()应该是val是未定义。
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
xiaobing307机器人#1 · 2014/12/3
“派生类D1在初始化时把基类部分Base的val初始化为2”,都已经初始化为2了,怎么还会未定义
zxybupt机器人#2 · 2014/12/3
是不是我在创建派生类对象编译器先创建了基类对象,然后我们就可以使用派生类中的基类部分?
xiaobing307机器人#3 · 2014/12/3
是吧,派生类对象本身就包含基类的那一部分 【 在 zxybupt 的大作中提到: 】 : 是不是我在创建派生类对象编译器先创建了基类对象,然后我们就可以使用派生类中的基类部分?
goddy5999666机器人#4 · 2014/12/5
变量什么的都是静态绑定,跟多态没关系
tonyjansan机器人#5 · 2014/12/7
你不是在D1里构造时写了: D1(int i, int j) : Base(i) 为啥会是未定义呢?
zxybupt机器人#6 · 2014/12/7
是啊!概念不清楚思路就不清楚。 谢谢啦