C++ 抽象类:成员函数“virtual...”的抽象返回类型无效
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16457603/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Abstract class : invalid abstract return type for member function ‘virtual...’
提问by Brian Brown
In my program I have such class hierarchy:
在我的程序中,我有这样的类层次结构:
#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
class aa;
class bb;
class root
{
public:
virtual ~root() {}
virtual root add(const aa& a) const=0;
virtual root add(const bb& a) const=0;
};
class aa: public root
{
public:
aa() { }
aa(const aa& a) { }
virtual root add(const aa& a) const
{ return root(new aa()); }
virtual root add(const bb& a) const
{ return root(new bb()); }
};
class bb: public root
{
public:
bb() { }
bb(const bb& b) {}
virtual root add(const aa& a) const
{ return root(new bb()); }
virtual root add(const bb& a) const
{ return root(new bb()); }
};
int main(int argc, char **argv)
{
}
but Im still getting errors in compilation process. I cant change my class hierarchy but it is possible to make something I want here?
但我仍然在编译过程中出错。我无法更改我的类层次结构,但可以在这里制作我想要的东西吗?
EDITED CLASS:
编辑类:
#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
class root
{
public:
virtual ~root() {}
virtual root add(const root& a) const=0;
virtual root add(const root& b) const=0;
};
class aa: public root
{
public:
aa() { }
aa(const aa& a) { }
virtual root add(const root& a) const
{ return root(new aa()); }
virtual root add(const root& b) const
{ return root(new bb()); }
};
class bb: public root
{
public:
bb() { }
bb(const bb& b) {}
virtual root add(const root& a) const
{ return root(new bb()); }
virtual root add(const root& b) const
{ return root(new bb()); }
};
int main(int argc, char **argv)
{
}
Errors for edited class:
编辑类的错误:
/home/brian/Desktop/Temp/Untitled2.cpp|11|error: ‘virtual root root::add(const root&) const' cannot be overloaded|
/home/brian/Desktop/Temp/Untitled2.cpp|10|error: with ‘virtual root root::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|10|error: invalid abstract return type for member function ‘virtual root root::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: because the following virtual functions are pure within ‘root':|
/home/brian/Desktop/Temp/Untitled2.cpp|10|note: virtual root root::add(const root&) const|
/home/brian/Desktop/Temp/Untitled2.cpp|11|error: invalid abstract return type for member function ‘virtual root root::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|20|error: invalid abstract return type for member function ‘virtual root aa::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|22|error: invalid abstract return type for member function ‘virtual root aa::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|22|error: ‘virtual root aa::add(const root&) const' cannot be overloaded|
/home/brian/Desktop/Temp/Untitled2.cpp|20|error: with ‘virtual root aa::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root aa::add(const root&) const':|
/home/brian/Desktop/Temp/Untitled2.cpp|20|error: invalid abstract return type for member function ‘virtual root aa::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|21|error: cannot allocate an object of abstract type ‘root'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root aa::add(const root&) const':|
/home/brian/Desktop/Temp/Untitled2.cpp|22|error: invalid abstract return type for member function ‘virtual root aa::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|23|error: cannot allocate an object of abstract type ‘root'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|23|error: expected primary-expression before ‘(' token|
/home/brian/Desktop/Temp/Untitled2.cpp|23|error: expected type-specifier before ‘bb'|
/home/brian/Desktop/Temp/Untitled2.cpp|23|error: expected ‘)' before ‘bb'|
/home/brian/Desktop/Temp/Untitled2.cpp|32|error: invalid abstract return type for member function ‘virtual root bb::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|34|error: invalid abstract return type for member function ‘virtual root bb::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|34|error: ‘virtual root bb::add(const root&) const' cannot be overloaded|
/home/brian/Desktop/Temp/Untitled2.cpp|32|error: with ‘virtual root bb::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root bb::add(const root&) const':|
/home/brian/Desktop/Temp/Untitled2.cpp|32|error: invalid abstract return type for member function ‘virtual root bb::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|33|error: cannot allocate an object of abstract type ‘root'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root bb::add(const root&) const':|
/home/brian/Desktop/Temp/Untitled2.cpp|34|error: invalid abstract return type for member function ‘virtual root bb::add(const root&) const'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
/home/brian/Desktop/Temp/Untitled2.cpp|35|error: cannot allocate an object of abstract type ‘root'|
/home/brian/Desktop/Temp/Untitled2.cpp|6|note: since type ‘root' has pure virtual functions|
||=== Build finished: 38 errors, 0 warnings ===|
回答by Kerrek SB
You cannot return a root
by value, since root
is abstract and thus there can never exist any values of type root
.
您不能root
按值返回 a ,因为它root
是抽象的,因此永远不会存在任何类型的值root
。
You might want to return a pointer:
您可能想要返回一个指针:
#include <memory>
std::unique_ptr<root> do_you_feel_lucky(aa const & x, bb const & y)
{
if (rand() % 2 == 0)
return { new aa(x) };
else
return { new bb(y) };
}
What you have feels a lot like a "clone" or "virtual copy" function, though:
但是,您所拥有的感觉很像“克隆”或“虚拟复制”功能:
struct Base
{
virtual std::unique_ptr<Base> clone() const = 0;
};
struct Derived : Base
{
virtual std::unique_ptr<Base> clone() const
{
return { new Derived(*this); }
}
};
Since you asked about references, here's another thing you could do, though it seems a bit pointless: Pick a reference to one among several derived objects and return a base reference.
既然您询问了引用,那么您可以做另一件事,尽管这似乎有点毫无意义:从几个派生对象中选择一个引用并返回一个基引用。
root & pick_one_from_two(aa & x, bb & y)
{
return rand() % 2 == 0 ? x : y;
}