小马甲又来啦!小问题请大家帮忙~~~~~~~~~~~~~~

xiaomajia2009 2009-03-13 11:39:44
如果基类里有纯虚函数,就不能声明该基类的对象

但是如果基类中也有其他函数,那如果要调用该函数怎么办?

例如:
#include<iostream.h>
class island
{
public:
void headline(void)
{
cout<<"!!welcome to Island!! \n";
}
virtual void type(void)=0;
};

class type_1:class island
{
public:
void type(void)
{
cout<<"type_1 \n";
}
};
class type_2:class island
{
public:
void type(void)
{
cout<<"type_2 \n";
}
};
main(void)
{
island *ptr;
type_1 t_1;
type_2 t_2;
ptr->headline();
ptr=&type_1;
ptr->type();
ptr=&type_2;
ptr->type();
return(0);
}


这样是可以输出,但是有错误:局部变量ptr尚未初始化!

咋解决?
...全文
154 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mengde007 的回复:]
8楼与作者原意相违!
[/Quote]
你知道作者意愿?
mengde007 2009-03-13
  • 打赏
  • 举报
回复
8楼与作者原意相违!
chin_chen 2009-03-13
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
class island
{
public:
void headline(void)
{
cout<<"!!welcome to Island!! \n";
}
virtual void type(void)=0;
};

class type_1:public island//public继承时类型才可以显示多态性,你不写这个public,默认private继承
{
public:
void type(void)
{
cout<<"type_1 \n";
}
};
class type_2: public island//public继承时类型才可以显示多态性,你不写这个public,默认private继承
{
public:
void type(void)
{
cout<<"type_2 \n";
}
};
int main(void)
{
island *ptr;
type_1 t_1;
type_2 t_2;

ptr=&t_1;
ptr->headline();//在使用这个函数之前,你得实例话它,则放在 ptr=&t_1;后面
ptr->type();//这样就可以清楚的看到多态性了
ptr=&t_2;
ptr->headline();//在使用这个函数之前,你得实例话它,则放在 ptr=&t_2;后面
ptr->type(); //这样就可以清楚的看到多态性了
system("pause");
return(0);
}
fibbery 2009-03-13
  • 打赏
  • 举报
回复
一般来说,抽象类中只定义接口,在派生类里具体实现,也就是说,抽象基类中一般是不定义数据成员的;
当然,这不是一个不变的真理,在抽象出所有类都应该具有的数据成员时,也可以将该数据成员放在抽象基类中,
但此时,应该提供一个受保护的构造函数,来初始化该数据成员。

抽象基类不可以声明实例变量,但可以声明其指针和引用的变量,借后面两者实现动态多态。
对于,抽象基类中的非虚函数,完全可以使用其指针、引用来调用,如果该非虚函数没有访问任何数据成员,则改掉用没有任何问题。但是,这样的函数一般是没有实际使用价值的。
xiaomajia2009 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuqiangu 的回复:]
用基类的指针指向派生类对象

如 :

island* ptr;

ptr = new type_1;
ptr->headline();
ptr->type();

ptr = new type_2;
ptr->headline();
ptr->type();

delete ptr;
[/Quote]

呵呵~谢拉,我知道啦,可以直接访问派生类的headline嘛,没必要非得去访问基类的啊!

嘿嘿~刚开始学,不好意思!
wuqiangu 2009-03-13
  • 打赏
  • 举报
回复
用基类的指针指向派生类对象

如 :

island* ptr;

ptr = new type_1;
ptr->headline();
ptr->type();

ptr = new type_2;
ptr->headline();
ptr->type();

delete ptr;
xiaomajia2009 2009-03-13
  • 打赏
  • 举报
回复


如果我想调用抽象类里的函数,又没办法定义抽象类的对象,有什么其他办法么?
wudeshou82666 2009-03-13
  • 打赏
  • 举报
回复
用静态成员函数吧
fibbery 2009-03-13
  • 打赏
  • 举报
回复
#include<iostream.h>
class island
{
public:
void headline(void)
{
cout<<"!!welcome to Island!! \n";
}
virtual void type(void)=0;
};

class type_1:public island
{
public:
void type(void)
{
cout<<"type_1 \n";
}
};
class type_2:public island
{
public:
void type(void)
{
cout<<"type_2 \n";
}
};
main(void)
{
island *ptr;
type_1 t_1;
type_2 t_2;
ptr->headline();
ptr=&t_1;
ptr->type();
ptr=&t_2;
ptr->type();
return(0);
}


由于你在headline函数中没有访问任何数据成员,对于基类里面也没有数据成员,所以,你在使用未初始化的island类型指针时,没有任何问题,因为,改掉用将转化为:headline(ptr);而在函数内部,并没有使用ptr,所以,没有任何问题。
xiaomajia2009 2009-03-13
  • 打赏
  • 举报
回复
回帖赚十分~
  • 打赏
  • 举报
回复
type_1 ty1;
ty1.headline();

这样不就调用了吗。。。

yangkunhenry 2009-03-13
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
class island
{
public:
void headline(void)
{
cout<<"!!welcome to Island!! \n";
}
virtual void type(void)=0;
};

class type_1:public island//
{
public:
void type(void)
{
cout<<"type_1 \n";
}
};
class type_2:public island//
{
public:
void type(void)
{
cout<<"type_2 \n";
}
};
int main(void)
{
island *ptr=NULL;//
type_1 t_1;
type_2 t_2;
ptr->headline();
ptr=&t_1;//
ptr->type();
ptr=&t_2;//
ptr->type();
return 0 ;
}
  • 打赏
  • 举报
回复
class type_1:class island


这个能通过编译???
kaer_zhong 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaomajia2009 的回复:]


如果我想调用抽象类里的函数,又没办法定义抽象类的对象,有什么其他办法么?
[/Quote]

把这个函数声明为静态函数,它不属于对象,只属于类,用的时候前面加域名。
s79947171 2009-03-13
  • 打赏
  • 举报
回复

基类指针指向派生类对象时,如果基类的函数为虚函数,如virtual void type(void)=0;则基类指针island *ptr;
调用type的时候看的是地址,如果基类函数不是虚函数,咋基类指针调用函数的时候看的是指针的类型来区分调用哪个

64,646

社区成员

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

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