注册 登录
编程论坛 C++教室

private继承的时候,能否再用using来声明基类中的成员?

newyj 发布于 2008-04-28 17:22, 1544 次点击
private继承的时候,能否再用using来声明基类中的成员?
10 回复
#2
sunkaidong2008-04-28 17:23
你贴代码吧.一起讨论
#3
newyj2008-04-28 17:36
这个是Effective 中的一段代码
我只是把继承中的public换成了private
class Base{
  private:
    int x;
  public:
    virtual void mf1()=0;
    virtual void mf2(int);
    virtual void mf2();
    void mf3();
    void mf3(double);  
};
class Derived: private Base{
  public:
    using Base::mf1;
    using Base::mf3;
    virtual void mf1();
    void mf3();
    void mf4();
}
这里的using Base::mf1;using Base::mf3;是否还能起到预期的作用
#4
sunkaidong2008-04-28 18:12
好像不可以...类型转化错误
#include<iostream>
using namespace std;
class Base{
  private:
    int x;
  public:
    virtual void mf1()=0;
    //virtual void mf2(int);
    //virtual void mf2();
    void mf3();
    void mf3(double);  
};
void Base::mf1()
{
    cout<<"Base"<<endl;
};
class Derived: private Base{
  public:
    using Base::mf1;
    using Base::mf3;
    void mf1();
    void mf3();
    void mf4();
};
void Derived::mf1()
{
  cout<<"Derived"<<endl;
}
int main()
{
   Derived a;
   Base &b=a;
   b.mf1();
   return 0;
}
其实你不用using的话..派生类也是可以看见的
#5
sunkaidong2008-04-28 18:26
如果只是讨论可见,确实是可见的
#include<iostream>
using namespace std;
class Base{
  private:
    int x;
  public:
    virtual void mf1()=0;
    //virtual void mf2(int);
    virtual void mf2();
    void mf3();
    void mf3(double);  
};
void Base::mf2()
{
    cout<<"Base"<<endl;
};
class Derived: private Base{
  public:
    using Base::mf1;
    using Base::mf2;
    void mf1();
    void mf3();
    void mf4();
};
void Derived::mf1()
{
  cout<<"Derived"<<endl;
  mf2();
};
int main()
{
   Derived a;
   a.mf1();
   return 0;
}
#6
sunkaidong2008-04-28 18:37
这个东西就是在绕逻辑....像java里面的接口默认公有..一般实现多态都需要公有继承..和虚函数公有...看一点基础的书..高级得太困难...呵呵,一起进步...

[[it] 本帖最后由 sunkaidong 于 2008-4-28 18:56 编辑 [/it]]
#7
中学者2008-04-28 20:26
[bo]以下是引用 [un]newyj[/un] 在 2008-4-28 17:36 的发言:[/bo]

这个是Effective 中的一段代码
我只是把继承中的public换成了private
class Base{
  private:
    int x;
  public:
    virtual void mf1()=0;
    virtual void mf2(int);
    virtual void mf2();
    void mf3() ...

完全没效果嘛,你派生类已经存在这些接口了///
#8
中学者2008-04-28 20:27
除非你派生类的接口没有定义,这样就相当于多次声明了/
#9
中学者2008-04-28 20:32
我错了,,,有点繁琐,不讨论了/
#10
newyj2008-04-28 20:39
谢谢楼上两位的回答
using Base::mf1;是声明基类中mf3()和mf3(double)这两个函数吗?
是告诉 派生类 只要是基类中函数名为mf3的都可以调用吗
#11
sunkaidong2008-04-28 20:58
原来私有继承的用using可以变对象的公有可见函数...
#include<iostream>
using namespace std;
class Base{
  private:
    int x;
  public:
    virtual void mf1()=0;
    //virtual void mf2(int);
    virtual void mf2();
    void mf3();
    void mf3(double);  
};
void Base::mf2()
{
    cout<<"Base"<<endl;
};
class Derived: private Base
{
  public:
    using Base::mf1;
    using Base::mf2;
    void mf1();
    void mf3();
    void mf4();
};
void Derived::mf1()
{
  cout<<"Derived"<<endl;
  mf2();
};
int main()
{
   Derived a;
   a.mf1();
   a.mf2();
   return 0;
}
1