读书人

私有继承后经过访问声明显示调用基类

发布时间: 2012-03-06 20:47:55 作者: rapoo

私有继承后经过访问声明,显示调用基类的同名函数报错。
class A{
public:
void f(){}
};

class B:private A{
public:
void f(){}

A::f; //访问声明,使得A中的f()还保持公有
};

main()
{
B b;
b.A::f(); //报错!请问为什么呢?
}

此问题,若是公有继承则没有问题,若是私有继承且派生类的f()改名不与基类重名也没有问题,何解?谢谢了。

[解决办法]
如果是私有继承,基类的所有成员在派生类中为private的阿。。
[解决办法]
不知道楼主为什么要
b.A::f();
直接调用不行?
[解决办法]
in confusion... -_-b
[解决办法]
class B : private A
{
public:
void f()
{
A::f();
}
};
[解决办法]
由于父类和子类之间的函数同名,参数也相同
但是没有加virtual关键字
这时父类中的函数f被子类的函数f给隐藏掉了,在子类中是不能调用父类的这个函数的。
[解决办法]
#include <iostream>

using namespace std;

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

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

using A::f; //访问声明,使得A中的f()还保持公有
};

int main()
{
B b;
b.f();
return 0;
}
[解决办法]
上面结果输出B...
[解决办法]
using A::f; //访问声明,使得A中的f()还保持公有
=====================================================
把注释去掉...
[解决办法]

class A{
public:
void f(){}
};

class B:private A{
public:
void f(){}

A::f; //只要是私有继承,基类的所有成员在派生类中全为private,不可能再为公有的
};

main()
{
B b;
b.A::f(); //报错!因为A类的在B类为私有的,即使是B类的对象也不能直接调用
}
同名不同名那就是函数覆盖问题,去看看就行了
[解决办法]
楼上的DX,有结果了?
====================
什么啊?
[解决办法]
虾米是DX啊
[解决办法]
class A{
public:
void f(){}
};

class B:private A{
public:
void f(){}
A::f; //访问声明,使得A中的f()保持公有属性
};

void main()
{
B b;
b.f(); //不能再用A::来调用了,访问声明就是为了去掉A::
}
[解决办法]
这个问题应该是这样理解的:
1、首先:
私有继承后,成员全部为私有了。
(using) A::f 只是个访问申明 ,并未改变其性质。//仅允许访问(这点上有点像友元)。
2、 其次:
函数查找的问题。当编译器看到b.f();
首先在类内查找,再向最近的基类依次向上查找。所以是个覆盖隐藏问题。(同名时)
不同名时的情况是,编译器向上找到A::f,并根据访问声明,允许通过。
3、最后:
当你显式使用b.A::f();时,编译器的查找方法是:直接到A类找到函数f,发现是私有,且知道 b不是A类的对象。按照私有访问的要求拒绝了。
(这个查找过程编译器没有看到B中访问声明,个人觉得也不应该如此 "智能 "去做这件事)
所以是个命名查找的问题。

解决同名覆盖隐藏问题。也很简单。
用一个基类的指针,指向b,然后用这个指针直接调用。由于你这个函数不是虚的,不会有多态的行为发生。

读书人网 >C++

热点推荐