返回信息流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是未定义。
这是一条镜像帖。来源:北邮人论坛 / cpp / #84566同步于 2014/12/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教一下c++多态(动态绑定)问题
zxybupt
2014/12/3镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
是吧,派生类对象本身就包含基类的那一部分
【 在 zxybupt 的大作中提到: 】
: 是不是我在创建派生类对象编译器先创建了基类对象,然后我们就可以使用派生类中的基类部分?