首页 新闻 会员 周边 捐助

c++中虚函数的问题

0
[待解决问题]

#include "iostream"
using namespace std;

class A
{
protected:
 int data;
public:
 A(int d=0)
 {
  data=d;
 }
 int getdata()
 {
  return dogetdata();
 }
 virtual int dogetdata()
 {
  return data;
 }
};

class B:public A
{
protected:
 int data;
public:
 B(int d=1)
 {
  data=d;
 }
 virtual int dogetdata()
 {
  return data;
 }
};

class C:public B
{
protected:
 int data;
public:
 C(int d=2)
 {
  data=d;
 }
 
};

int main(int argc, char* argv[])
{
 C c(10);
 cout<<c.getdata()<<endl;
 return 0;
}

 这个结果输出是1,调用的是B中的dogetdata(),我想问的是多态性的实现其中一条是用基类指针调用,这个不符合要求啊,那么怎么还是实现了多态性呢

汉汉的主页 汉汉 | 初学一级 | 园豆:200
提问于:2011-09-01 00:14
< >
分享
所有回答(5)
0

这个代码跟多态没有关系。

你在用c的实例调用dogetdata,调用的是c继承来的b的函数。

其实这个一个普通的继承。

Jerry Chou | 园豆:2642 (老鸟四级) | 2011-09-01 14:48
若dogetdata不是virtual,应该结果是0,现在是去调用A::dogetdata()的时候,它在c的虚函数表中已经被B::dogetdata()给覆盖了,所以结果是1
支持(0) 反对(0) 汉汉 | 园豆:200 (初学一级) | 2011-09-01 14:53
我似乎也被讲糊涂了 :)
你讲的dogetdata是A中的,还是C中的
你在A中用了关键字virtual在所有子类中,该同名函数都是virtual,不管你是否在b中加了virtual关键字。
支持(0) 反对(0) Jerry Chou | 园豆:2642 (老鸟四级) | 2011-09-01 15:29
0

貌似这样才能显示多态性吧:

int main()
{
A
*a = new B;
cout
<<a->getdata()<<endl;
return 0;
}

hailong | 园豆:70 (初学一级) | 2011-09-03 21:10

这个我倒是知道

支持(0) 反对(0) 汉汉 | 园豆:200 (初学一级) | 2011-09-04 08:48
0
wyatt_123 | 园豆:220 (菜鸟二级) | 2011-09-16 11:22
0

似乎可以这么理解?调用getdata的时候 return dogetdata();等价于this->dogetdata。然后this为A类指针 即是父类指针,然后通过VTLB实现调用B::dogetdata

Jooooooker | 园豆:280 (菜鸟二级) | 2012-01-12 12:11
0
Rollen Holt | 园豆:210 (菜鸟二级) | 2012-04-30 23:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册