在派生类中重新定义typedef?

Zee*_*bit 7 c++ virtual inheritance overriding typedef

因此,经过大量搜索我的问题的答案后,我终于放弃了我的Google技能.

我有一个基类Base和一个派生类Derived.我想在Derived类中使用一个类重写Base类中的类型.这是一个例子:

class Apple {
public:
    Apple() { }

    // ...

};

class Orange {
public:
    Orange() { }

    // ...

};

class Base {
public:
    typedef Apple fruit;

    // ...

    virtual fruit func() { return Apple(); }
};

class Derived : public Base {
public:
    typedef Orange fruit;

    // ...

    fruit func() override { return Orange(); } // <-- Error C2555!
};
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用,它给出了一个

C2555 error ('Derived::func': overriding virtual function return type differs and is not covariant from 'Base::func').
Run Code Online (Sandbox Code Playgroud)

以上是我尝试过的解决方案之一.我也尝试在Base中创建一个虚拟嵌套类,并在Derived中重新定义,并且也没有编译(它也非常混乱).

我也无法从同一个基类派生苹果和橘子,以返回BaseDerived中父类的指针/引用.我需要物理返回对象的实例.

  1. 有什么办法可以声明抽象typedef吗?
  2. 如果没有,是否有任何其他解决方案可以实现我想要做的事情?

Naw*_*waz 7

首先,看看这个语法:

fruit func() override { return Orange(); }
Run Code Online (Sandbox Code Playgroud)

什么是override?在C++ 03中,没有这样的关键字.它只在C++ 11中.因此,请确保您使用的是知道此关键字的编译器.

第二,在派生类中,fruit的确如此Orange.重新定义typedef不是问题.问题是,OrangeApple不是协变型.从另一个中获取将使它们变得协变.在您的情况下,您必须从中获取Orange,Apple以使其工作.

请注意,您必须将返回类型更改fruitfruit*fruit&.

class Orange : public Apple {}; //correct - your code will work

class Apple : public Orange {}; //incorrect - your code will not work
Run Code Online (Sandbox Code Playgroud)

我们的想法是,在基类,返回类型应该是指针/引用的基本类型(这是Apple),并且在派生类,返回类型可以是指针/引用类型的Apple或从中导出的任何类.

顺便问一下,这有意义吗?Orange从中衍生出来Apple

下面的课程设计怎么样?

class Fruit {};
class Apple : public Fruit {};
class Orange : public Fruit {};

class Base
{
   virtual Fruit* f();
};

class Derived : public Base 
{
   virtual Fruit* f();
};
Run Code Online (Sandbox Code Playgroud)

无需使用typedef.