class A;
class B :private A{
private:
int myth;
public:
B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
myth=my;}
int getmessage(){
return message;
}
int getmyth(){
return myth;
}
class A {
private:
int message;
public:
A(int a);
friend int B::getmessage();
};
A::A(int a){
message=a;
}
上面的代码编译在VC++2008中通过不了,我知道原因,但是,该怎样写呢,这个不知道了啊。如果把基类A定义在B的前面,则在A中有一行代码:friend int B::getmessage();
编译器是会报错的,因为没有事先定义B中是否有getmessage()这个成员。
希望我把我的意思表达清楚了,真正清楚的人请给个解释,感激不尽。
14 个解决方案
#1
B类的getmessage函数需要访问父类A的数据成员是吗
建议你把A中的该父类数据成员添加上一个公有get函数来访问
取消掉friend
建议你把A中的该父类数据成员添加上一个公有get函数来访问
取消掉friend
#2
B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
你这个观点就错误了,这个肯定可以编译通过的。因为你在定义class B的前面就申明了class A。这就使得编译器在编译class B的时候找到class A的定义了。
你这个观点就错误了,这个肯定可以编译通过的。因为你在定义class B的前面就申明了class A。这就使得编译器在编译class B的时候找到class A的定义了。
#3
不要 friend, 把 A 的 int message; 改成 protected
#4
它这里是个private继承
#5
private 继承也可以在派生类中访问 protected 成员.
#6
private继承也是可以访问基类的protect成员,派生列表中的访问标号对本继承类能否访问其基类没有影响,其只影响到该类的使用者能否其基类的成员。派生类可以使用其直接基类中的所有public 和 protect成员。
#7
这种情况为什么不在基类写函数 派生类直接拿来用呢?
#8
哦
确实是
学习了
只影响外界访问
那请问private和protected继承有什么区别呢
确实是
学习了
只影响外界访问
那请问private和protected继承有什么区别呢
#9
基类的int getmessage()写成int getmessages()
派生类int getmessage(){getmessages();}
派生类int getmessage(){getmessages();}
#10
private继承后再继承出子类就不能访问最初基类的成员
而protected继承可以
是这样吗
而protected继承可以
是这样吗
#11
把 class B 的实现代码放到 class A 后面试试
public:
B(int ms,int my );
.....
class A{
};
......
inline B::B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
myth=my;}
public:
B(int ms,int my );
.....
class A{
};
......
inline B::B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
myth=my;}
#12
为啥要这么写呢?
#13
是的,private继承使原来基类的public和protect成员在本继承类里都成了privat成员,该继承类可以像访问自己定义的成员一样来访pivate继承来的基类,但由该派生类再派生出的派生类,就不能访问原始基类中的成员了。而protect继承可以使派生类的派生类访问原始基类的public和protect成员。
PS:之前引用你的留言,我的意思是很同意你的意见,只是忘了写 “++”了,我是csdn的新手,还不太熟悉这里的环境,望请见谅,呵呵。
#14
那说明我之前理解有误
学习了~~
学习了~~
#1
B类的getmessage函数需要访问父类A的数据成员是吗
建议你把A中的该父类数据成员添加上一个公有get函数来访问
取消掉friend
建议你把A中的该父类数据成员添加上一个公有get函数来访问
取消掉friend
#2
B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
你这个观点就错误了,这个肯定可以编译通过的。因为你在定义class B的前面就申明了class A。这就使得编译器在编译class B的时候找到class A的定义了。
你这个观点就错误了,这个肯定可以编译通过的。因为你在定义class B的前面就申明了class A。这就使得编译器在编译class B的时候找到class A的定义了。
#3
不要 friend, 把 A 的 int message; 改成 protected
#4
它这里是个private继承
#5
private 继承也可以在派生类中访问 protected 成员.
#6
private继承也是可以访问基类的protect成员,派生列表中的访问标号对本继承类能否访问其基类没有影响,其只影响到该类的使用者能否其基类的成员。派生类可以使用其直接基类中的所有public 和 protect成员。
#7
这种情况为什么不在基类写函数 派生类直接拿来用呢?
#8
哦
确实是
学习了
只影响外界访问
那请问private和protected继承有什么区别呢
确实是
学习了
只影响外界访问
那请问private和protected继承有什么区别呢
#9
基类的int getmessage()写成int getmessages()
派生类int getmessage(){getmessages();}
派生类int getmessage(){getmessages();}
#10
private继承后再继承出子类就不能访问最初基类的成员
而protected继承可以
是这样吗
而protected继承可以
是这样吗
#11
把 class B 的实现代码放到 class A 后面试试
public:
B(int ms,int my );
.....
class A{
};
......
inline B::B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
myth=my;}
public:
B(int ms,int my );
.....
class A{
};
......
inline B::B(int ms,int my ):A(ms){ //我知道这里编译是通过不了的,因为A初始化的过程没有提前定义.A(ms)不存在。
myth=my;}
#12
为啥要这么写呢?
#13
是的,private继承使原来基类的public和protect成员在本继承类里都成了privat成员,该继承类可以像访问自己定义的成员一样来访pivate继承来的基类,但由该派生类再派生出的派生类,就不能访问原始基类中的成员了。而protect继承可以使派生类的派生类访问原始基类的public和protect成员。
PS:之前引用你的留言,我的意思是很同意你的意见,只是忘了写 “++”了,我是csdn的新手,还不太熟悉这里的环境,望请见谅,呵呵。
#14
那说明我之前理解有误
学习了~~
学习了~~