关于C++继承的问题

Stieven 发布于 2014/08/02 16:22
阅读 163
收藏 0
#include <iostream>
using namespace std;


class Base
{
public:
virtual void mf1() = 0;
};


class Derived: public Base
{
private:
virtual void mf1()
{
cout << "call Derived::mf1()" << endl;
}
};


int main(void)
{
Base *p = new Derived;
p->mf1();
return 0;
}

在基类里mf1是公有的,而派生类里是私有的,那么感觉不可能“p->mf1();”通过的

加载中
0
梁金堂
梁金堂

与其说是继承,不如说是组合. 新类=(基类+...+基类)+新成员.

Base *p = new Derived; 表示将Derived中的Base部分拿出来,并将指针赋给p,

所以当然是Base中的mf1()了


0
ericsoul
ericsoul
这个问题很神奇,基类里面是纯虚函数。这个我感觉是可以编译通过,因为编译只检查静态类型,就是你申明 base p,之后可以调到fm1函数。执行时应该会报runtime error,因为,p对应的动态类型,derived,里面的fm1,在main函数里面是没有访问权限的。
0
ericsoul
ericsoul
有新的结论:运行时也不会报错。因为函数的访问权限应该只在编译期有,编译成机器码就已经没有访问权限控制了。所以最终,应该是可以编译,也可以运行。这个特点等于为我们提供了一个强制使用子类的程序员必须使用基类的指针来调用子类实现的函数,而达到多态的目的,因为子类的函数,用子类对象直接使用时,没有访问权限。
0
ericsoul
ericsoul
这个要好好确认一下,回去机器上整一整。
S
Stieven
嗯嗯
返回顶部
顶部