多态性->错误:“没有已知的从派生类到基类的转换”

mr5*_*mr5 2 c++ polymorphism inheritance

我怎样才能做到这一点:

class Base
{
public:
    int a, b, c;
    void function();
    ...
};

class Derived1 : 
    private Base
{
public:
    int d, e, f;
    ...
};

class Derived2 :
    private Base
{
public:
    void addObject(const Base* obj);
    ...
};
Run Code Online (Sandbox Code Playgroud)

请注意,我将其继承为私有


然后我想做这样的事情:

Base* d1 = new Derived1();
Base* d2 = new Derived2();

d2->addObject(d1);
Run Code Online (Sandbox Code Playgroud)

这是我从编译器那里得到的相关问题:

C:\test\test.cpp||In function 'void init()':|
C:\test\test.cpp|423|error: no matching function for call to 'Derived2::addObject(const Base*)'|
C:\test\test.cpp|423|note: candidate is:|
C:\test\test.h|29|note: void Derived2::addObject(const Base*)|
C:\test\test.h|29|note:   no known conversion for argument 1 from 'Derived1 {aka ... }' to 'const Base* {aka ... }'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 9 seconds) ===|
Run Code Online (Sandbox Code Playgroud)

我想通过某些派生类继承为Base私有的原因是为了隐藏Base公共范围内的某些成员/函数。

我不想直接访问Base::functions()公共范围内的某些内容,而是使用 aDerived::function()来操作其数据成员,并让派生类决定它将执行什么操作。

但是,我可以考虑重写基类中的每个函数,我不想在公共范围内直接修改这些函数,但它不灵活,而且在我的情况下太多。

我的意思是:

class Base
{
public:
    //I must think in advance deciding whether if it'll be virtual or not.
    [virtual] void f1(int);
    [virtual] void f2(int);
    [virtual] void f3(int);
    //and many more...
};

class Derivedn :
    private Base
{
public:
    //hmm, I should not neglect to override certain base' member functions
    //that I don't want to access in public scope.
    void f1(int);
};
Run Code Online (Sandbox Code Playgroud)

我想避免这种情况,但是...

有没有其他方法可以做,类似于这个,而不覆盖每个Base::function()s?

das*_*ght 5

这不起作用的原因是私有继承并不构成“是”关系。事实上,它比继承更接近于组合,因为派生类获取基类的实现而不获取其接口。

我想通过某些派生类将 Base 继承为私有的原因是在公共范围内隐藏某些 Base 的成员/函数。

这是私人继承的错误理由。以下是关于何时应该私下继承这个问题的一些很好的答案。

有没有其他方法可以做,类似于这个,而不覆盖每个 Base::function() ?

您不需要重写 Base 的每一个函数,除非它们是纯虚拟(也称为“抽象”)函数。您的基类可以为其虚拟函数提供空实现,以便派生类可以决定提供哪些功能。