c++ 继承,不太理解。

nickwu1220 2013-03-13 11:57:57

class A
{
public:
void show()
{
printDate();
}
void printDate()
{
cout<<"month/day/year"<<endl;
}
};

class B: public A
{
public:
void printDate()
{
cout<<"year/month/day"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.show();
B b;
b.show();
return 0;
}

为什么b.show()也输出month/day/year,A的printDate()不是被B的printDate()隐藏了吗?望各位仔细的给我这个菜鸟讲解下。c++各种规则真多。
...全文
244 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
翅膀又硬了 2013-03-14
  • 打赏
  • 举报
回复
记住一点就够了,只有虚函数才会动态绑定;虚函数一定动态绑定
nickwu1220 2013-03-14
  • 打赏
  • 举报
回复
原来大牛都是这么晚还在电脑前啊。
iamnobody 2013-03-14
  • 打赏
  • 举报
回复
void show() { printDate(); } printDate 是一个名字,首先要根据名字查找规则到到它的声明(name-lookup) ,根据规则,无论printDate 是否虚函数,都不会查到它派生类的名字. 所以只会找到A::printDate. 至于虚函数,那又是另一个知识点了. 看书吧, <c++ primer>
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
派生类会继承父类的所有方法,如果没有virtual 修饰,你的方法都是不会被重写,你说你的B类为什么也输出同样的结果: 1,你没有重写show,当然这个不是直接导致的 2,你的printDate没有被重写,没有virtual修饰,你就算在派生类再怎么写,还是调用父类的方法。 3,你还没有理解什么是重写,这个是基于virtual修饰的情况下,派生类才有权利去重写,否则一律调用父类。 如果还不懂,建议你再回去看下多态吧
nickwu1220 2013-03-13
  • 打赏
  • 举报
回复
引用 1 楼 ganpengjin1 的回复:
C/C++ code ? 123456789101112131415161718192021222324252627282930 class A { public: void show() { printDate(); } virtual void printDate() { cout<<"month/d……
我知道这么改,可以正确调用到B::printDate().我想知道的是,按照之前那样写,为什么就不会调用B::printDate().B已经继承了A的show().而且重写了printDate(),这样B的printDate()不是会隐藏掉A的printDate()吗?
漫步者、 2013-03-13
  • 打赏
  • 举报
回复

class A
{
public:
	void show()
	{
		printDate();
	}
	virtual void printDate()
	{
		cout<<"month/day/year"<<endl;
	}
};

class B: public A
{
public:
	void printDate()
	{
		cout<<"year/month/day"<<endl;
	} 
};
int _tmain(int argc, _TCHAR* argv[])
{
	A a;
	a.show();
	B b;
	b.show();
        return 0;
}
你的派生类需要重写父类的方法,那么你就把那个方法设置为virtual就可以了,这样派生类才用于属于自己的行为.
nickwu1220 2013-03-13
  • 打赏
  • 举报
回复
还有哪位高手给讲解讲解?
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
引用 9 楼 nickwu1220 的回复:
我个人的理解是这样的:b.show(),实际调用的是A::show(),然后调用printDate(),是在A::的作用域下查找有没有printDate这个函数,如果有就调用,如果没有才编译失败? 是这样吗?
不是说没有的,B继承了A,A的方法及其数据,B都会拥有。你前面一部分说对了,只是B看不见方法被重写,只会去调用父类的。
nickwu1220 2013-03-13
  • 打赏
  • 举报
回复
我个人的理解是这样的:b.show(),实际调用的是A::show(),然后调用printDate(),是在A::的作用域下查找有没有printDate这个函数,如果有就调用,如果没有才编译失败? 是这样吗?
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
引用 5 楼 nickwu1220 的回复:
引用 3 楼 ganpengjin1 的回复: 派生类会继承父类的所有方法,如果没有virtual 修饰,你的方法都是不会被重写,你说你的B类为什么也输出同样的结果: 1,你没有重写show,当然这个不是直接导致的 2,你的printDate没有被重写,没有virtual修饰,你就算在派生类再怎么写,还是调用父类的方法。 3,你还没有理解什么是重写,这个是基于virtual修饰的情况下,派……
每个类都有一个this指针,它只会调用该类本身的方法及其成员而已。
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
引用 5 楼 nickwu1220 的回复:
引用 3 楼 ganpengjin1 的回复: 派生类会继承父类的所有方法,如果没有virtual 修饰,你的方法都是不会被重写,你说你的B类为什么也输出同样的结果: 1,你没有重写show,当然这个不是直接导致的 2,你的printDate没有被重写,没有virtual修饰,你就算在派生类再怎么写,还是调用父类的方法。 3,你还没有理解什么是重写,这个是基于virtual修饰的情况下,派……
引用 6 楼 MAOMAOXIAOHUO 的回复:
所谓隐藏,是指子类看不见父类的同一种签名的方法,并不是子类覆盖父类方法,而是重写了父类方法。当调用B调用show时,其实是调用了从A继承而来的show方法,因为是A的方法,在show是看不到B的printDate。如果printDate是一个虚方法,则父类的printDate方法将被覆盖。
class A { public: void show() { printDate(); } void printDate() { cout<<"month/day/year"<<endl; } }; class B: public A { public: void printDate() { cout<<"year/month/day"<<endl; } void show() { this->printDate();//这this调用的是类本身的方法 } };
lzjamao 2013-03-13
  • 打赏
  • 举报
回复
所谓隐藏,是指子类看不见父类的同一种签名的方法,并不是子类覆盖父类方法,而是重写了父类方法。当调用B调用show时,其实是调用了从A继承而来的show方法,因为是A的方法,在show是看不到B的printDate。如果printDate是一个虚方法,则父类的printDate方法将被覆盖。
nickwu1220 2013-03-13
  • 打赏
  • 举报
回复
引用 3 楼 ganpengjin1 的回复:
派生类会继承父类的所有方法,如果没有virtual 修饰,你的方法都是不会被重写,你说你的B类为什么也输出同样的结果: 1,你没有重写show,当然这个不是直接导致的 2,你的printDate没有被重写,没有virtual修饰,你就算在派生类再怎么写,还是调用父类的方法。 3,你还没有理解什么是重写,这个是基于virtual修饰的情况下,派生类才有权利去重写,否则一律调用父类。 如果还不……
书上是说,因为静态联编。是说b.show()的时候,void show() { this-> printDate(); } ,这个this仍然是A类型吗?
jimette 2013-03-13
  • 打赏
  • 举报
回复
你那个 又不是多态 多台靠指针和引用来实现!

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧