相关疑难解决方法(0)

为什么禁止在后续的私有派生类中简单提及基指针/引用?

struct B {};
struct D : private B {
  B* fun () { return new D; }  // ok
}
struct DD : public D {
  B* foo () { return 0; } // error: ‘struct B B::B’ is inaccessible !
};
Run Code Online (Sandbox Code Playgroud)

这个错误对我来说似乎不合理.如果我们可以B*在全局范围内使用简单,那么为什么不在其私有派生类中呢?g ++演示.

我们是不是要转换DD*B*,这是由语言规则(禁止这个,这个,这个是相关的问题).
需要注意的是,如果我改变B* foo()int foo(),事情的罚款.

c++ compiler-errors language-lawyer

14
推荐指数
2
解决办法
248
查看次数

受保护的派生类

 #include <iostream>
using namespace std;

class Base
{
    public:
        Base(){cout <<"Base"<<endl;}
        virtual ~Base(){cout<<"~Base"<<endl;}
        virtual void foo(){ cout<<"foo base"<<endl;}
};

class Derived: private Base
{
    public:
        Derived(){cout<<"Derived"<<endl;}
        virtual ~Derived(){cout<<"~Derived"<<endl;}
        virtual void  foo(){ cout<<"foo dervied"<<endl;}
};


int main(int argc, char *argv[])
{
    Base *pb = new Derived;
    Derived d;
    d.foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我执行上面的示例程序时,我得到以下错误:protected.cpp:在函数'int main(int,char**)'中:protected.cpp:26:错误:'Base'是'Derived'的一个不可访问的基础

为什么不可能用基指针创建Derived对象????


所以我可以创建一个Derived类的instanse

Derived d
Derived d1= new Derived;
Run Code Online (Sandbox Code Playgroud)

但是从Base类指针创建实例就像

Base * b = new derived 
Run Code Online (Sandbox Code Playgroud)

将失败.

这是因为当衍生出来并私有时,Derived不是来自Base的派生类.

它是否正确?????

c++ inheritance

5
推荐指数
1
解决办法
1646
查看次数