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

时间:2013-11-29 02:31:53

标签: 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);
    ...
};

请注意,我将其作为私有

继承

然后我想这样做:

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()

3 个答案:

答案 0 :(得分:2)

这不起作用的原因是私下继承并不构成“是一种”关系。实际上,与继承相比,它更接近于组合,因为派生类在不获取其接口的情况下获取了基类的实现。

  

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

这是私下继承的错误理由。 Here are some good answers to the question when you should inherit privately.

  

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

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

答案 1 :(得分:0)

我认为您的代码应为:

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

正如编译器所说,没有可能从Derived1的实例转换为指向Base实例的const指针。

答案 2 :(得分:0)

不确定你想要什么,但多态性正是如此,允许你覆盖Derived类中的基函数:

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对象

访问Derived版本的函数