Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 私有继承和派生对象到基引用_C++ - Fatal编程技术网

C++ 私有继承和派生对象到基引用

C++ 私有继承和派生对象到基引用,c++,C++,据我所知,我们不能将派生类对象传递给基类引用以进行私有继承的原因是,由于派生类是从基类私有继承的,所以基类的默认构造函数将在派生类的构造函数之前被调用。但因为它是私有的,并且不是继承到派生的,所以我们得到了一个编译器错误 但是,如果我尝试为Base创建一个公共构造函数并从派生的私有继承,然后将公共状态重新分配给Base的构造函数,它是否允许我将派生的实例传递给Base引用 我试了以下方法 #include <iostream> using namespace std; class

据我所知,我们不能将派生类对象传递给基类引用以进行私有继承的原因是,由于派生类是从基类私有继承的,所以基类的默认构造函数将在派生类的构造函数之前被调用。但因为它是私有的,并且不是继承到派生的,所以我们得到了一个编译器错误

但是,如果我尝试为Base创建一个公共构造函数并从派生的私有继承,然后将公共状态重新分配给Base的构造函数,它是否允许我将派生的实例传递给Base引用

我试了以下方法

#include <iostream>

using namespace std;

class base
{
      public:
             base(){}
             void print(){ puts("In base"); }
};

class derived : private base
{
      public:
             base::base;   /* Throws an error - Declaration doesnt declare anything*/
             void print(){ puts("In derived"); }
};

void func(base& bRef)
{
}

int main()
{
    derived dObj;
    func(dObj); /*  Throws an error - 'base' is an inaccessible base of derived */
}
#包括
使用名称空间std;
阶级基础
{
公众:
base(){}
void print(){put(“In base”);}
};
派生类:私有基
{
公众:
base::base;/*引发错误-声明不声明任何内容*/
void print(){put(“In派生”);}
};
无效函数(基函数和基函数)
{
}
int main()
{
导出的dObj;
func(dObj);/*抛出一个错误-“base”是派生函数的不可访问的基*/
}
它为base::base(将私有继承的构造函数公开给公众)抛出一个错误。
我所尝试的是有效的吗?有人能告诉我吗?

我们不能对私有继承的派生对象进行基类引用的原因是,这会违反:派生对象不是基类对象,因为它不提供基类公共接口。你无法解决这个问题

由于这个原因,私有继承是重用实现的一种方式,而不是在您想要生成更专门的类型时。由于这在大多数情况下都可以通过组合完成(即拥有基类的成员而不是私有派生),因此私有继承可能是一种不好的代码味道


您可以阅读(请确保遵循所有链接)以了解有关何时私有继承是一个好的选择的更多信息(摘要:当没有其他选择时).

我们不能对私有继承的派生对象进行基类引用的原因是,这将违反:派生对象不是基类对象,因为它不提供基类公共接口。你无法解决这个问题

由于这个原因,私有继承是重用实现的一种方式,而不是在您想要生成更专门的类型时。由于这在大多数情况下都可以通过组合完成(即拥有基类的成员而不是私有派生),因此私有继承可能是一种不好的代码味道


您可以阅读(确保遵循所有链接)以了解有关何时私有继承是一个好的选项(摘要:当没有其他选择时)的更多信息。

否,使用基类的指针或引用指向派生的对象是无效的。如果可能,那么私有继承的全部目的(隐藏派生类从基类继承其部分(或全部)功能的事实)将是无用的

假设您在基类中有一个方法
foo()
。您不希望调用此方法。但是如果可以从基类的指针指向对象,那么也可以调用
foo()

当您声明私有继承时,就好像派生类与基类不相关一样。只有你,开发人员,唯一一个应该“知道”这种关系存在的人,实际上你应该忘记它,因为它根本不起作用


私有继承只是作为一种可重用机制,而不是真正的继承机制。甚至不建议使用它,因为您可以通过简单地应用组合来获得更好的结果(即仅在派生中创建类Base的属性)。

否,使用基类的指针或引用指向派生的对象是无效的。如果可能,那么私有继承的全部目的(隐藏派生类从基类继承其部分(或全部)功能的事实)将是无用的

假设您在基类中有一个方法
foo()
。您不希望调用此方法。但是如果可以从基类的指针指向对象,那么也可以调用
foo()

当您声明私有继承时,就好像派生类与基类不相关一样。只有你,开发人员,唯一一个应该“知道”这种关系存在的人,实际上你应该忘记它,因为它根本不起作用


私有继承只是作为一种可重用机制,而不是真正的继承机制。甚至不建议使用它,因为您可以通过简单地应用composition获得更好的结果(即,仅在派生中创建class Base的属性)。

感谢您的解释。出于好奇,我还有一个疑问。我知道我们可以在派生类中公开基类的公共方法,当它是从基类私有继承的。但是我们能对base的公共构造函数做同样的事情吗?它有效吗?不,您必须创建一个简单的构造函数,例如:派生():基(){}。谢谢您的解释。出于好奇,我还有一个疑问。我知道我们可以在派生类中公开基类的公共方法,当它是从基类私有继承的。但是我们能对base的公共构造函数做同样的事情吗?它有效吗?不,您必须创建一个简单的构造函数,例如:派生():基(){}。
Base * ptrBase = &objDerived;      // Let's suppose this would compile
ptrBase->foo();                    // Now we can call foo() (?)