下面的代码有什么问题?

ratzip 2011-05-07 07:02:04
#include <iostream>
using namespace std;

class A {
public:
A ();
virtual ~A();
};

class B: protected A {
public:
virtual ~B ();
};

int main() {
A* pb = new B;//A is inaccessable base of B
return 0;
}


请问这个代码有什么问题? 当我编译的时候,告诉我A is inaccessable base of B, 什么意思?到底问题在哪里,构造函数和析构函数是否应该都定义,而不仅仅是申明? 还有别的问题吗?
...全文
174 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaotine_wu 2011-05-09
  • 打赏
  • 举报
回复
改下权限,然后把函数实现就应该可以了
  • 打赏
  • 举报
回复
访问权限
Defonds 2011-05-09
  • 打赏
  • 举报
回复
改下权限
lishengkai 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ratzip 的回复:]
可是这个代码里父类没有什么成员啊, 是不是说,B 是从A 继承的,用A 的指针去访问B,其实只能访问到属于class A 的成员,即便B 的成员是public的,那么A的指针也不能访问?

引用 7 楼 lishengkai 的回复:

从B *到A *的转换是可以的,这个不会有问题,有问题的是你用的是protected继承,那么父类的所有成员在子类中都是protected成员,那么你声明……
[/Quote]

看来你对多态还很不清楚 可以先看看书再来考虑下这个问题
这么说吧,用一个指向父类的指针去new一个子类,这个指针你就把它看做一个子类的对象指针,它只能访问子类中的public成员,你这个地方用的是protected继承,那么你父类的所有成员在子类中都是protected成员,你new的这个指针的就无法访问到,你编译的时候编译器会告诉你从B *到A *的转换存在,但是会提示你无法访问的错误(我用的VS2008编译)
一根烂笔头 2011-05-07
  • 打赏
  • 举报
回复
改成public后又继续会引发相应问题,你不妨试试!只是估计,没有检验!

你的构造函数,析构函数声明了,没有定义,这样是不能够创建对象的!因为无妨初始化与析构对象!原因:没有析构构造定义!但却声明了,那么编译器会省去给你自动创建构造函数与析构函数!
lishengkai 2011-05-07
  • 打赏
  • 举报
回复
从B *到A *的转换是可以的,这个不会有问题,有问题的是你用的是protected继承,那么父类的所有成员在子类中都是protected成员,那么你声明的那个对象指针是无法访问的到protected里面的成员的~~ 所以就会报错了
qinhf55 2011-05-07
  • 打赏
  • 举报
回复
有人能说下出错原因吗?
xiaolomg 2011-05-07
  • 打赏
  • 举报
回复
是啊,改成public!
机器再学习 2011-05-07
  • 打赏
  • 举报
回复
protect改为public,LZ可以试试看
無_1024 2011-05-07
  • 打赏
  • 举报
回复
继承方式改一下 改成public 不要用protected
yy935624461 2011-05-07
  • 打赏
  • 举报
回复
恩!!对啊
nakedavril 2011-05-07
  • 打赏
  • 举报
回复
class B: public A {
public继承就可以了
qq120848369 2011-05-07
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A {
public:
virtual ~A(){};
};

class B: public A {
public:
virtual ~B (){};
};

int main() {
A * pb = new B;//A is inaccessable base of B

return 0;
}


就是,成员都没实现怎么可能运行。
whut_lcy 2011-05-07
  • 打赏
  • 举报
回复
A()和~A()没有实现。
wuchengfeng222 2011-05-07
  • 打赏
  • 举报
回复
我测试了一下 改成public 一样会出错, 不能解析 A B。 看看楼下能解决不
qq120848369 2011-05-07
  • 打赏
  • 举报
回复
有虚函数还是public吧。
ratzip 2011-05-07
  • 打赏
  • 举报
回复
可是这个代码里父类没有什么成员啊, 是不是说,B 是从A 继承的,用A 的指针去访问B,其实只能访问到属于class A 的成员,即便B 的成员是public的,那么A的指针也不能访问?

[Quote=引用 7 楼 lishengkai 的回复:]

从B *到A *的转换是可以的,这个不会有问题,有问题的是你用的是protected继承,那么父类的所有成员在子类中都是protected成员,那么你声明的那个对象指针是无法访问的到protected里面的成员的~~ 所以就会报错了
[/Quote]
SleepCat2010 2011-05-07
  • 打赏
  • 举报
回复
同意楼上的..

64,683

社区成员

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

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