#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;
}
当我执行上面的示例程序时,我收到以下错误: protected.cpp:在函数'int main(int,char **)'中: protected.cpp:26:错误:'Base'是'Derived'的无法访问的基础
为什么无法使用基指针????
创建Derived对象所以我可以像
那样创建Derived类的实例Derived d
Derived d1= new Derived;
但是从Base类指针创建实例,如
Base * b = new derived
会失败。
这是因为Derived在派生和私有派生时不是来自Base的派生类吗?
这是正确的?????
答案 0 :(得分:6)
为什么无法使用基指针????
创建Derived对象
因为基数为private
。这明确禁止从外部将您的类视为Base
实例。从外部看,您的班级Derived
不是Base
的子类,仅来自班级内部。
protected
继承的计数相同,唯一的区别是基类现在不再属于自己的类,而是属于任何派生类。但是,在外面,它的行为就像私人继承一样。
答案 1 :(得分:4)
答案 2 :(得分:0)
所以我可以像
那样创建Derived类的实例派生d派生d1 =新派生;但 从Base类创建实例 像
这样的指针Base * b = new derived将失败。
这是因为Derived不是 来自Base的派生类 派生时和私人派生的?
这是正确的?????
就像康拉德解释的那样。
实际上它仍然来自Base。要验证这一点,如果您没有覆盖Derived中的虚拟方法,那么将调用Base版本。
但是,由于您将Base声明为protected,编译器不会让您自动将Derived *强制转换为Base *,因为Base超类在外部不可见。