接口继承的问题

pengzhixi 2009-05-27 07:31:02
父类中声明为private的非虚函数接口能被子类继承过来么?如果是虚函数或者纯虚函数又会怎样?
...全文
160 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nwao7890 2009-05-27
  • 打赏
  • 举报
回复
mark中午再细看
jn989 2009-05-27
  • 打赏
  • 举报
回复
能继承过来,但不能访问
从面向对象的设计上考虑也不能将需要继承的放在基类的私有成员中;如果真的出现这个问题,说明设计还是有问题;有些东西是可以放在保护成员里的,别忘了protect
冷月清晖 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fengxuxing 的回复:]
1.非虚函数接口
这种情况自然不能继承,私有的函数对继承类来讲是不可见的。
2.虚函数或者纯虚函数
事实上可以,对于纯虚函数你可以这样设计

C/C++ codeclass A
{
public:
void open()
{
f();
}
private:
virtual void f()=0;
};

class B:public A
{
private:
void f()
{
cout<<"B"<<endl;
}
};


int _tmain(int argc, _TCHAR* argv[])
{

[/Quote]


C/C++ code
class A
{
public:
void open()
{
f();
}
private:
void f(){cout<<"A:f()"<<endl;};
};



这样应该也能访问。
fairchild811 2009-05-27
  • 打赏
  • 举报
回复
继承是继承了,只是不能访问,继承时肯定要保持完整性.
虚函数应该也不能吧
lhy 2009-05-27
  • 打赏
  • 举报
回复
private在子类中正常的访问编译器会不认,这是编译器的功能。
纯虚的private功能健全的编译器应该会不通过。
cyldf 2009-05-27
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

class A
{
private:
virtual void f()
{
cout<<"hello,A"<<endl;
}
};

class B:public A
{
public:
void g()
{
//f();
cout<<"hello,B"<<endl;
}
};

int main()
{
B b;//debug看,void A::f()已经被继承过来,只是不能够访问而已。
b.g();
return 0;
}

正如5楼所说,父类的private成员和函数实际上是被继承到子类中了,只是受private访问权限的控制,不能被访问而已。
coverallwangp 2009-05-27
  • 打赏
  • 举报
回复
其实在子类中有一份完整的父类,也就是说父类的private的东西在子类中也是有的,只是子类看不到,没法访问。
pathuang68 2009-05-27
  • 打赏
  • 举报
回复
5L的说法是有道理的,而且诸如在基类中是private的成员变量,在派生类中也有办法可以访问到的,请看:
http://blog.csdn.net/pathuang68/archive/2009/04/20/4096088.aspx

根据Stan Lippman的说法,基类被继承到派生类时,“会保持其完整性”,因此基类的所有的成员,不管是私有的还是公有的,都会原封不动地被继承到子类,但用常规手段,子类无法访问其基类的私有成员而已。
papaofdoudou 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fengxuxing 的回复:]
1.非虚函数接口
这种情况自然不能继承,私有的函数对继承类来讲是不可见的。
2.虚函数或者纯虚函数
事实上可以,对于纯虚函数你可以这样设计

C/C++ codeclass A
{
public:
void open()
{
f();
}
private:
virtual void f()=0;
};

class B:public A
{
private:
void f()
{
cout<<"B"<<endl;
}
};


int _tmain(int argc, _TCHAR* argv[])
{

[/Quote]
我感觉,父类的private成员和函数实际上是被继承到子类中了,只是受private访问权限的控制,不能被访问而已。
继承与否和能否被访问是两码事
xqls_xqls 2009-05-27
  • 打赏
  • 举报
回复
UP
acdbxzyw 2009-05-27
  • 打赏
  • 举报
回复
顶一下。
Qlaiaqu 2009-05-27
  • 打赏
  • 举报
回复
1.非虚函数接口
这种情况自然不能继承,私有的函数对继承类来讲是不可见的。
2.虚函数或者纯虚函数
事实上可以,对于纯虚函数你可以这样设计
class A
{
public:
void open()
{
f();
}
private:
virtual void f()=0;
};

class B:public A
{
private:
void f()
{
cout<<"B"<<endl;
}
};


int _tmain(int argc, _TCHAR* argv[])
{
A * a= new B;
a->open();
return 0;
}

3.纯虚函数都可以如此,对于虚函数的话自然不在话下

昨天我正好碰见这个问题,这么设计我不知道有没有更为深层次的问题,还请牛人来回答了
papaofdoudou 2009-05-27
  • 打赏
  • 举报
回复
既然是private了,肯定不会被子类访问到了。利用子类的指针或者对象调用这个函数会出现编译时刻错误的。
接口继承必须使用public继承方式,这样子类和父类的关系就是“是一个”,C++里面的接口和COM中的接口有一小点差别,C++中的接口指的是类的成员函数,不管私有的还是公有的都是接口,也都会被子类继承下来,但是究竟能不能访问就是另外一回事情了。
如果是虚函数或者纯虚函数,并且是public的,会被子类继承下来并且可以改写,在基类中声明private的虚函数感觉没有多大意义。

ztenv 版主 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 pengzhixi 的帖子:]
父类中声明为private的非虚函数接口能被子类继承过来么?如果是虚函数或者纯虚函数又会怎样?
[/Quote]

子类实例是一个完整的父类实例,即:子类拥有父类所有的成员;但不能访问父类私有的成员;

64,654

社区成员

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

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