C++ 多态性->;错误:';没有从派生类到基类的已知转换';

C++ 多态性->;错误:';没有从派生类到基类的已知转换';,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我怎么可能做到这一点: 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); ... };

我怎么可能做到这一点:

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);
    ...
};
请注意,我将其继承为private


然后我想这样做:

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

d2->addObject(d1);
下面是我从编译器那里得到的相关问题:

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) ===|
我希望将
Base
作为私有继承给某些派生类的原因是将一些
Base
的成员/函数隐藏在公共范围内

我不想直接访问公共作用域中的某些
Base::functions()
,而是使用
Derived::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);
};
我想避免这样,但是


有没有其他类似的方法可以在不重写每个
Base::function()
s的情况下执行呢?

我认为您的代码应该是:

d2.addObject(&d1); // Note the "&"

正如编译器所说,不可能从
Derived1
的实例转换为指向
Base

的实例的常量指针。这不起作用的原因是私有继承不构成“是”关系。事实上,与继承相比,它更接近组合,因为派生类获取了基类的实现,而没有获取其接口

我希望某些派生类将基类作为私有继承的原因是在公共范围内隐藏一些基类的成员/函数

这是一个错误的私人继承理由

有没有其他类似的方法可以在不重写每个Base::function()的情况下执行


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

不确定您想要什么,但多态性正是这样做的,允许您重写派生类中的基类函数:

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

class Derived1 : 
    public Base
{
public:
    int d, e, f;
    virtual void function(); // do derived version of Base::function
};

现在您可以从基本对象访问函数的派生版本了,对不起,这是一个输入错误。当然,我不想在每个派生类上继承每个
Base::functions()
,但在我的实现中,我应该小心使用
Base::function()的w/c
当某个函数应该在公共范围内执行时,我必须重写。既然我能做到这一点,我认为在我的情况下这不是一个好的选择。@mr5请注意,您可以有选择地将一些继承的函数设置为私有()。我非常喜欢将继承设置为私有,这样我就可以避免过多的
函数重写。但是,如果我这样做了,我就不能执行
d2->addObject(d1)东西。同时提前考虑,决定是否将
基本成员函数
声明为
虚拟
,对我来说似乎是个问题。@mr5您应该将它们全部虚拟化:一旦添加第一个虚拟函数,添加更多虚拟函数的开销就很小,不管是十个以上还是一百个以上。@mr5私下继承不会让您有选择地告诉哪些函数应该可用于哪些派生类。C++访问控制没有这样的精细粒度级别。问题不是用<代码>函数< /> >而是用<代码> Advase< <代码>。