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中重新定义,并且也没有编译(它也非常混乱).
我也无法从同一个基类派生苹果和橘子,以返回Base和Derived中父类的指针/引用.我需要物理返回对象的实例.
首先,看看这个语法:
fruit func() override { return Orange(); }
Run Code Online (Sandbox Code Playgroud)
什么是override?在C++ 03中,没有这样的关键字.它只在C++ 11中.因此,请确保您使用的是知道此关键字的编译器.
第二,在派生类中,fruit的确如此Orange.重新定义typedef不是问题.问题是,Orange而Apple不是协变型.从另一个中获取将使它们变得协变.在您的情况下,您必须从中获取Orange,Apple以使其工作.
请注意,您必须将返回类型更改fruit为fruit*或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.