下面的代码不是为我编译的......
class Base
{
public:
Base(){}
virtual void Display()
{
cout << "Base Display" << endl;
}
};
class Derived : private Base
{
private:
void Display() override
{
cout << "Derived Display" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Derived d;
d.Display();
Derived* dp = new Derived();
dp->Display();
delete dp;
return 0;
}
调用Derived::Display()
时编译器报告错误。怎么称呼它?
我们可以通过编写这样的代码来解决哪些问题?
答案 0 :(得分:4)
您无法从课堂外访问私有方法。因此编译错误。
答案 1 :(得分:3)
这里混合了两个不同的概念,成员函数的访问说明符和基类的访问说明符。
您无法调用成员函数,因为其访问说明符为private
,并且您尝试从不是朋友的函数调用。这与Base
的继承类型无关,即使存在这种关系。
继承关系中的访问说明符确定代码的哪些部分可以将您的类型视为Base
,哪些不能。在这种特殊情况下,在Derived
及其朋友中,您可以使用Derived
的引用或指针,就像它是Base
一样,但不能在void detail(Base *base) {
base->Display(); // Base::Display is public
}
void Derived::show() { // Derived::show is public:
detail(this); // Private inheritance is visible inside Derived
}
之外。
怎么称呼它?我们可以通过编写这样的代码来解决哪些问题?
私有继承模型,通过使用您自己的类型无需在概念上派生的第三方库/类层次结构,可以用来提供某些功能。避免公共继承会阻止您的用户将您视为基础,这是有意的,因为这是实现的详细信息。在您自己的类型中,您可以使用继承关系:
{{1}}
答案 2 :(得分:2)
您在派生类中使Display
为私有,因此可以通过Base,
的指针/引用访问它,但不能直接在Derived
对象中访问,也不能通过引用/指针访问到Derived
。
// This should work:
Base *b = new Derived;
b->Display();
// and so should this:
Derived d;
Base &b = d;
b.Display();
...但其中任何一项都需要公开继承才允许从Derived
隐式转换为Base
。
答案 3 :(得分:1)
您不能使用私有继承调用派生类方法,即使将其定义为public,也会变为私有。
答案 4 :(得分:0)
私有继承隐藏了外部世界的每个方法和属性,因此堆或堆栈上的Derived
实例不能像在main函数中那样直接调用Display。您可以将private
替换为public
以避免此类错误,或使用指向Base
的指针来访问隐藏的基本方法。
编辑:改进了Jerry的建议。
答案 5 :(得分:0)
私有继承创建“包含 - ”关系(它实际上类似于创建类型为Base
的成员变量)。你试图做的是创建一个“is-a”关系,这是通过公共继承来完成的。